Я не смог найти четкого ответа о том, всегда ли возвращение из метода async
приводит к семантике выпуска, и всегда ли await
производит семантику получения. Я предполагаю, да, потому что в противном случае любой код async/await
был бы минным полем?
Итак, вот пример: гарантированные ли возвращаемые значения равны 100*2
и 12345*2
, без каких-либо явных блокировок или барьеров?
private static async Task<(int, int)> AMethod()
{
// Runs on the original thread:
var x = 100;
var y = 12345;
var task = Task.Run(() =>
{
// Can run on another thread:
x *= 2;
y *= 2;
// Implicit return here, marking the task completed.
// Release semantics or not?
});
await task; // Acquire semantics or not?
// Runs on the original thread:
return (x, y);
}
РЕДАКТИРОВАТЬ: Конечно, Task.Run
также необходимо произвести выпуск, и приобретение необходимо при запуске кода задачи. Забыл про тех в оригинальном вопросе.