Вопрос 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
?