【发布时间】:2016-04-18 21:56:34
【问题描述】:
在这段代码中:
public async Task v_task()
{
await Task.Run(() => Console.WriteLine("Hello!"));
}
public async void v1()
{
await v_task();
// some other actions...
}
public void ButtonClick()
{
v1();
Console.WriteLine("Hi!");
}
如果ButtonClick被调用,上面哪些方法实际上是在async/await生成的底层线程池中并行执行的?
我的意思是,对于使用 async/await 的竞争条件,我应该担心什么?所有异步方法都必须在同一个调用者的线程中执行吗?我应该在可能的共享状态上使用互斥锁吗?如果是,我如何检测共享状态对象是什么?
【问题讨论】:
-
默认情况下,所有异步延续都在它们启动的同一个同步上下文中执行。在控制台应用程序中没有同步上下文,所有任务都将在线程池中运行。所以是的,你应该注意比赛条件。共享状态对象是所有任务中正在访问的对象。
-
你好@VMAtm!那么,调用图将在相同的同步上下文中执行(我认为这与线程相同),直到找到第一个“等待”关键字?此时(执行调用图中的第一个“等待”)“等待”下面的代码将在不同的线程中执行?
标签: c# multithreading asynchronous async-await