Я понимаю, что следующий плохая практика, так как он блокирует поток:TPL async ждет - асинхронная задача должна связать стек вызовов?
Task t = Task.Run(() => MyMethod());
t.Wait();
Хотя следующее не блокирует нить:
await MyMethod();
Однако использовать ждать, надо использовать ключевое слово async в сигнатуре метода и возвращает Task
, а не пустоту, или Task<T>
.
Однако в приложении N-Tier, если у вас есть огромный вызов в стек, то мы должны иметь каждый метод вызове асинхронной/Task, как показано на следующем простом примере из LINQPad:
async void Main()
{
int i = await GetNumberD();
i.Dump();
}
async Task<int> GetNumberD()
{
return await GetNumberC();
}
async Task<int> GetNumberC()
{
return await GetNumberB();
}
async Task<int> GetNumberB()
{
return await GetNumberA();
}
async Task<int> GetNumberA()
{
await Task.Delay(TimeSpan.FromSeconds(1));
return 7;
}
Я не думаю, что вы понимаете, как работают асинхронные методы. Прочитайте эту вступительную статью https://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_WhatHappensUnderstandinganAsyncMethod – Spo1ler
Я думаю, что я совершенно ясно понимаю, как работает метод async. Я просто не понимаю, как это распространяется на стек вызовов и влияние на потоки в каждом вызывающем методе. Если бы вы могли ответить на мой комментарий к ответу Отиля ниже, я был бы очень благодарен. – DrGriff