我已经asked a question了如何知道当另一方库代码的字符串在我的代码中发生变化时。我可以随时访问字符串本身。但是不能实现INotifyPropertyChanged,因为它不是我的代码。
我被提供使用BackgroundWorker,这个解决方案确实对我有效!但是,我试图确保它是最好的解决方案,并得到了关于第三方物流的建议,进一步的研究表明,第三方物流的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循环,它需要像BackgroundWorker一样运行asynchronously。在任务中找不到任何包含while循环的示例,所以我不确定如何实现。
我还读到Lambda表达式使用了更多的资源,并且在我见过的一些测试中显示了这一点,所以如果可能的话,我会尽量避免使用Lambda。
谢谢你的帮助!
发布于 2015-01-27 07:03:54
试试这个(未测试):
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();发布于 2015-01-27 07:34:47
我仍然看不到真正的好处,但你可以这样做:
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);
}
});
} https://stackoverflow.com/questions/28159990
复制相似问题