在我的研究中,似乎有大约一百万种不同的方法可以实现这一点,但每种方法的优缺点都不太清楚。似乎可以实现我所追求的一种可能性是:
private async Task SomeMostlyUIMethod(byte[] someParam = null)
{
if (InvokeRequired)
{
Task result = Task.Run(() => Invoke((Action)(async () => await SomeMostlyUIMethod(someParam))));
await result;
return;
}
else
{
// do some stuff
}
}
这似乎行得通,感觉应该有一个更明确的解决方案。我没有在每个控件修改的基础上调用,因为该方法修改了大量不同的 UI 组件,但也需要保持该方法异步,因为它也执行一些昂贵的非 ui 任务。
最佳答案
要使工作项在 UI 线程上执行,您可能需要当前同步上下文:
factory = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());
并使用那个 factory
来 StartNew
GUI 控件更新中涉及的任何任务。
关于c# - 在 C# Winforms 中,让异步方法保证其在 UI 线程上执行的最精确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41054735/