如何用(异步)Task.Run(TPL)替换(异步)BackgroundWorker?

时间:2015-01-26 22:34:08

标签: c# .net winforms asynchronous

asked a question了解如何知道我的代码中其他一方图书馆代码的字符串何时发生变化。我可以随时访问字符串本身。但是无法实施INotifyPropertyChanged,因为它不是我的代码。

我被允许使用BackgroundWorker,这个解决方案对我有用! 但是,我试图确保它是最好的解决方案,并建议查看TPL,进一步的研究表明,TPL的Task.Run可能是一个更好的解决方案,例如:Task parallel library replacement for BackgroundWorker?但我是无法在代码中实现它。

我正在尝试通过Task.Run替换此代码(感谢@ a.azemia)

        BackgroundWorker bw = new BackgroundWorker();
    bw.DoWork += (s, e) =>
        {
            while (true)
            {
                if (!fc.SecondString.Equals(AnotherPartyLibrary.firstString))
                {
                    fc.SecondString = AnotherPartyLibrary.firstString;
                }
                Thread.Sleep(1000);
            }
        };
    bw.RunWorkerAsync();

我无法找到适合我情景的任何示例,并尝试从其他示例中学习,但没有成功。我需要在任务中使用while循环,它需要像asynchronously一样运行BackgroundWorker。 无法在任务中找到任何带有while循环的示例,因此我不确定如何做到这一点。

我还读到Lambda表达式使用了更多的资源,并且在我已经看过的某些测试中显示了它,所以如果可能的话,我会喜欢避免使用Lambda。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

试试这个(未经测试):

public async Task DoWork()
{
   while (true)
  {
      if (!fc.SecondString.Equals(AnotherPartyLibrary.firstString))
      {
         fc.SecondString = AnotherPartyLibrary.firstString;
      }

       await Task.Delay(1000);
  }    
}     

我使用Task.Delay而不是Thread.Sleep,因为前者在发生延迟时不会阻塞线程。您可以使用await

调用此功能
 await DoWork();

答案 1 :(得分:0)

我仍然看不到真正的好处,但是你走了:

    private Task T;

    private void Form1_Load(object sender, EventArgs e)
    {

        // ... make sure your string stuff is setup first ...

        T = Task.Run(delegate() { 
            while (true)
            {
                // ... code ...
                System.Threading.Thread.Sleep(1000);
            }
        });
    }