WPF UI update from BackgroundWorker

本文关键字:BackgroundWorker from update UI WPF | 更新日期: 2023-09-27 18:06:57

试图找到类似的内容,但没有找到。

我有一个类,处理网站ping(保持活力)。此进程在后台运行,并带有ON/OFF触发器。

当"ping"正在运行时,它应该用以下数据更新WPF文本框:1. 加载开始时间2. 装货完成时间3.内容长度和一些更多的信息

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

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

我尝试了调度器,也尝试将文本框作为控件作为参数发送,并从那里编辑。

是我的Pinger类的一个片段。谢谢。

    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();
    }
}

WPF UI update from BackgroundWorker

你需要使用后台worker的Report Progress功能。它将调用从后台线程发送到UI线程。

类似于这样-只需将console更改为文本框。

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");
        }
相关文章:
  • 没有找到相关文章