如何解决VS2019警告,使用`JoinableTaskFactory.SwitchToMainThreadAsync()`替代Invoke/BeginInvoke?

4
如果我使用

Application.Current.Dispatcher.BeginInvoke(new Action(() => { /*UI code here*/ }));

在一个WPF项目中,Visual Studio 2019向我发出VSTHRD001警告:
等待 JoinableTaskFactory.SwitchToMainThreadAsync() 切换到 UI 线程,而不是可以导致死锁或需要指定优先级的 API。
如何实现此建议?

你有在谷歌上搜索过吗?文档似乎是一个很好的起点:https://learn.microsoft.com/en-us/visualstudio/extensibility/managing-multiple-threads-in-managed-code?view=vs-2019 - Andy
可能是如何在BeginInvoke内执行异步代码?的重复问题。 - ASh
@ASh 删除了那个问题。 - geometrikal
1个回答

5

点击这里。您应该使用以下代码替换对BeginInvoke的调用:

Microsoft.VisualStudio.Shell.ThreadHelper.JoinableTaskFactory.Run(async delegate {
    await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
    /*UI code here*/
});

2
ThreadHelper来自Microsoft.VisualStudio.Shell命名空间。这是安装扩展SDK的唯一方式吗? - geometrikal
@geometrikal:是的。那是一个问题还是观察? - mm8
1
有没有不使用那个包的方法来完成它? - geometrikal
@geometrikal:当然,您需要一个实际的 JoinableTaskFactory 实现才能使用它。 - mm8
2
我同意,对于通用使用而言,将某些内容放在Microsoft.VisualStudio.Shell中并不直观,而不是System.Threading.Tasks等其他地方。但这似乎是推荐的做法(请参考https://github.com/microsoft/vs-threading/issues/447#issuecomment-481481389)。 - BenV
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接