[英]Async Task in WPF
我试图为WPF UI Code Behind运行任务。 但是当我使用Task.Factory
,它不起作用并注意到它,但是当我使用没有Task.Factory
的代码时它可以正常工作
public MainWindow()
{
InitializeComponent();
GetNews();
}
private void GetNews()
{
Task.Factory.StartNew(() =>
{
FeedReader reader = new FeedReader();
var news = reader.RetrieveFeed("http://www.bbc.com/feed/");
foreach (var item in news)
{
textBlock.Text = item.Title;
}
});
}
我如何使用async / await或任何阻止阻塞主线程的东西?
没有任何事情发生,因为当您尝试修改UI线程之外的UI元素时会抛出异常。 您应该使用textBlock.Dispatcher.Invoke
方法或使FeedReader
异步并在您的方法中使用async/await
,这是更可取的。
所以首选的解决方案是(假设RetrieveFeed
是异步方法):
private async void GetNews()
{
FeedReader reader = new FeedReader();
var news = await reader.RetrieveFeed("http://www.bbc.com/feed/");
foreach (var item in news)
{
textBlock.Text = item.Title;
}
}
或者,您可以将Feed检索包装在任务中,该任务将与您当前的实现一起使用:
private async void GetNews()
{
FeedReader reader = new FeedReader();
var news = await Task.Run(() => reader.RetrieveFeed("http://www.bbc.com/feed/"));
foreach (var item in news)
{
textBlock.Text = item.Title;
}
}
此方法将起作用,因为await将捕获UI线程的SynchronizationContext
,并将值设置为UI线程中的文本框。
这里需要注意的是, async void
方法中抛出的异常从未被观察到并且丢失了。 因此,您应该将代码包装在try/catch
块中的GetNews
方法中,并至少记录异常,以便您了解它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.