C#异步:等待之后,我们是否需要锁定才能共享资源?

时间:2018-10-21 13:14:32

标签: c# async-await task

问题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吗?

1 个答案:

答案 0 :(得分:2)

await does not create a new thread,等待的代码和await之后的代码都将在同一线程中运行,除非您在ExecQuery中创建其他线程。是否需要lock取决于调用此方法的方式,如果要从多个线程调用此方法,则在等待使用lock或其他方法后,将需要同步线程对代码的访问。