问题1:
在这种情况下,lock
真的必要吗?
var combinedResponse = new Response();
foreach (var server in servers)
{
Response r = await sqlExecutor.ExecQuery(query, server);
lock (combinedResponse) // is the lock necessary here?
{
combinedResponse.Merge(r); //knowing that we must not merge 2 results in parallel
}
}
我不知道哪个是真的?
1)await
之后的代码与await
之前的代码在同一线程中执行(=>因此不需要锁定)
2)await
之后的代码可能在与await
之前的代码完全不同的线程中执行(=>因此有必要进行锁定)
问题2:
在我的情况下,ExecQuery
是受IO约束的任务,它不会产生任何其他线程。但是,如果不是这种情况(如果ExecQuery
是CPU密集型任务,可能会产生许多其他线程),那么我需要在lock
之后await
吗?
答案 0 :(得分:2)
await
does not create a new thread,等待的代码和await
之后的代码都将在同一线程中运行,除非您在ExecQuery
中创建其他线程。是否需要lock
取决于调用此方法的方式,如果要从多个线程调用此方法,则在等待使用lock
或其他方法后,将需要同步线程对代码的访问。