C# 在UI线程上运行的非等待异步方法?
我希望有一个方法(我们称之为M1)在循环中执行一些C# 在UI线程上运行的非等待异步方法?,c#,.net,multithreading,asynchronous,C#,.net,Multithreading,Asynchronous,我希望有一个方法(我们称之为M1)在循环中执行一些async代码(我们称之为第二个方法M2)。在每次迭代中-用户界面应更新为M2 为了等待M2,M1需要是异步的。但是M1应该在UI线程上运行(以避免争用条件),因此它将在没有wait的情况下被调用 我这样认为,M1对UI的更新将在UI线程上,对吗 (Extra:在这种情况下,似乎可以使用异步void。是否正确?是。(假设您使用的同步上下文返回到UI线程,即WinForm/WPF中的同步上下文) 请注意,这也意味着您不能以这种方式安排CPU密集型
async
代码(我们称之为第二个方法M2)。在每次迭代中-用户界面应更新为M2
为了等待M2,M1需要是异步的。但是M1应该在UI线程上运行(以避免争用条件),因此它将在没有wait
的情况下被调用
我这样认为,M1对UI的更新将在UI线程上,对吗
(Extra:在这种情况下,似乎可以使用
异步void
。是否正确?是。(假设您使用的同步上下文返回到UI线程,即WinForm/WPF中的同步上下文)
请注意,这也意味着您不能以这种方式安排CPU密集型操作,因为它将在UI线程上运行
使用void async
是WinForms中处理事件的标准方法:
void async click_RunManyAsync(...)
{
await M1();
}
void async M1()
{
foreach (...)
{
var result = await M2();
uiElement.Text = result;
}
}
async Task<string> M2()
{
// sync portion runs on UI thread
// don't perform a lot of CPU-intensive work
// off main thread, same synchronization context - so sync part will be on UI thread.
var result = await SomeReallyAsyncMethod(...);
// sync portion runs on UI thread
// don't perform a lot of CPU-intensive work
}
void async单击\u RunManyAsync(…)
{
等待M1();
}
void异步M1()
{
foreach(…)
{
var结果=等待M2();
uiElement.Text=结果;
}
}
异步任务M2()
{
//同步部分在UI线程上运行
//不要执行大量CPU密集型工作
//脱离主线程,相同的同步上下文-所以同步部分将在UI线程上。
var result=wait SomeReallyAsyncMethod(…);
//同步部分在UI线程上运行
//不要执行大量CPU密集型工作
}
是的,看来你是对的。试着去做。试着去做会很棘手,因为在这种情况下,比赛条件通常不太可能。我只是很小心,因为有时可能会有人碰到它们。@ispiro顺便说一句,如果你想尝试任务。延迟(10)
可能是创建真正异步方法的最简单方法。@AlexeiLevenkov感谢你的时间。我现在正在调查整件事。我真的不明白异步如果不在另一个线程上运行有什么意义。不管怎样,我现在正在仔细阅读。再次感谢,谢谢。但我没有明确使用任何同步上下文,我在UWP-Windows通用应用程序中使用了它。这还可以吗?是的,原则是sameI不理解您的示例-因为M1正在等待-它不会在UI线程上运行。是这样吗?@ispiroawait
不会更改代码运行的线程同步部分-因此await SomeReallyAsyncMethod
调用将在原始线程上进行。同步上下文决定异步操作结束后继续执行的位置。@isipro,否,await
将不会创建新线程(使用UI提供的同步上下文),除非您命令使用await任务手动创建它。运行(…cpu绑定的代码…
)。