C # async: нам нужно заблокировать, чтобы поделиться ресурсом после ожидания? - PullRequest
0 голосов
/ 21 октября 2018

Вопрос 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 является задачей, связанной с вводом-выводом, она не будет порождать никакой дополнительный поток.Но если бы это было не так (если бы ExecQuery была задача с привязкой к процессору, которая могла бы породить много дополнительных потоков), тогда мне нужно было бы lock после await?

1 Ответ

0 голосов
/ 21 октября 2018

await не создает новый поток , и ожидаемый код, и код после await будут выполняться в одном потоке, если вы не создадите дополнительные потоки в ExecQuery.Требуется ли вам lock, зависит от того, как вы вызываете этот метод, если вы вызываете его из нескольких потоков, вам нужно будет синхронизировать доступ потоков к коду после ожидания, используя lock или что-то еще.

...