如何更新一个WPF控件从TPL任务?控件、任务、WPF、TPL

2023-09-04 01:08:08 作者:Couvrir(困兽)

如何更新一个WPF控件从TPL任务?

How to update a WPF Control from the TPL Task?

细,所以我尝试了一些场景来使用调度但无论如何,它给人的错误。我需要帮助的人!

Fine so I tried some scenarios to use Dispatcher but anyway it gives the error. I need help guys!

private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        //Application.Current.Dispatcher.Invoke((Action)MyInit); 
        backgroundDBTask = Task.Factory.StartNew(() =>
            {
                DoSomething1();
            }, TaskCreationOptions.LongRunning);
        backgroundDBTask.ContinueWith((t) =>
        {
            // ... UI update work here ...
        },             
        TaskScheduler.FromCurrentSynchronizationContext());             
    }

    void DoSomething1()
    {
        // MyInit();
        int number = 0;
        while (true)
        {
            if (state)
            {
                Thread.Sleep(1000);
                Console.WriteLine("Begin second task... {0}", number++);
               // mostCommonWords = GetMostCommonWords(words) + string.Format("   Begin second task... {0}", number++);

                textBox2.Text = (number++).ToString(); // Gives the error

                Dispatcher.BeginInvoke(); // How it should be ?
            }
        }
    }

感谢您!

推荐答案

您需要传递一个委托,做你的工作,以的BeginInvoke 的BeginInvoke 将异步运行此委托在UI线程上。

You need to pass a delegate that does your work to BeginInvoke. BeginInvoke will asynchronously run this delegate on the UI thread.

例如:

Dispatcher.BeginInvoke(new Action(delegate {
    textBox2.Text = number.ToString(); 
}));