gpt4 book ai didi

c# - WPF 中的异步任务

转载 作者:行者123 更新时间:2023-11-30 19:08:48 26 4
gpt4 key购买 nike

我尝试为 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;
}
}

或者,您可以将提要检索包装在一个任务中,这将适用于您当前的实现:

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 block 中的 GetNews 方法中,并至少记录异常以便您了解它。

关于c# - WPF 中的异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43026548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com