【问题标题】:WPF UI update from BackgroundWorker [duplicate]来自 BackgroundWorker 的 WPF UI 更新 [重复]
【发布时间】:2014-06-05 12:25:40
【问题描述】:

试图找到类似的东西但找不到。

我有一个处理网站 ping 的类(保持活动状态)。 此过程在后台运行,触发 ON/OFF。

当“Pinger”运行时,它应该使用以下数据更新 WPF 文本框: 1.加载开始时间 2.加载完成时间 3.内容长度 以及更多信息。

我无法从后台工作人员访问 TextBox,因为 TextBox 不是静态的。 当我将 TextBox 作为参数发送并从那里更新它时,我收到一个错误,我无法更新 TextBox,因为它正在另一个线程上运行。

主要问题是 BackgroundWorker 一直异步运行,直到手动关闭。

我尝试了 Dispacher,还尝试将 TextBox 作为 Control 作为参数发送并从那里进行编辑。

这是我的 Pinger 课程的 sn-p。谢谢。

    class Pinger
{
    string urlToPing;
    int interval;
    BackgroundWorker bw;

    public Pinger()
    {
        urlToPing = Application.Current.Resources["UpdateUrl"].ToString();
        interval = int.Parse(Application.Current.Resources["RefreshRate"].ToString());

        bw = new BackgroundWorker();
        bw.WorkerReportsProgress = true;
        bw.WorkerSupportsCancellation = true;
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);

    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        PingIt();
        while (true)
        {
            if (bw.CancellationPending)
            {
                e.Cancel = true;
                break;
            }
            else
            {
                Thread.Sleep(interval * 1000);
                PingIt();
            }
        }
    }

    private void PingIt()
    {
        WebRequest req = HttpWebRequest.Create(urlToPing);
        WebResponse response = req.GetResponse();
    }
    public void Start(Control lastUpdateC, Control timeTakenC)
    {
        bw.RunWorkerAsync();
    }
    public void ShutDown() {
        bw.CancelAsync();
    }
}

【问题讨论】:

标签: c# wpf backgroundworker


【解决方案1】:

您需要使用后台工作人员的报告进度功能。这将调用从后台线程编组到 UI 线程。

像这样 - 只需将控制台更改为文本框。

bw.ProgressChanged += (sender, eventArgs) =>
            {
                Console.WriteLine(eventArgs.UserState);
            };


private static void BwOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
        {
            var bw = sender as BackgroundWorker;
            bw.ReportProgress(0, "My State is updated");
        }

【讨论】:

  • 似乎有效,我只需要在 MainWindow 而不是类库中进行回调。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 2021-07-16
  • 1970-01-01
相关资源
最近更新 更多