Хорошо, надеюсь, что у меня есть основы асинхронного/ждущего, но все же некоторые вопросы задерживаются в моей голове.
Но теперь это проблема, о которой я говорю. Предположим в этом простом примере
static void Main(string[] args)
{
Method();
Console.WriteLine("Main Thread");
Console.ReadLine();
}
public async static void Method()
{
await Task.Run(new Action(LongTask));
Console.WriteLine("New Thread");
}
public static void LongTask()
{
Thread.Sleep(8000);
Console.WriteLine("Long Task");
}
Основной поток продолжается и печатает Main Thread
после вызова метода() и встречается с ожиданием в течение 8 секунд.
Таким образом, метод() возвращается к вызывающей стороне, то есть к основной функции здесь, когда он встречается с ожиданием, сохраняет контекст синхронизации и продолжает выполнять оттуда.
Сначала он печатает Main Thread
.
Затем, после завершения 8 секунд, Long Task
и затем New Thread
печатаются.
Эта часть, которую я получил. Мой вопрос в моем приложении:
public IList<createcaseoutput> createCase(CreateCaseInput CreateCaseInput,SaveCaseSearchInput SaveCaseSearchInput)
{
.............
SQL.CaseSQL.getCreateCaseParameters(CreateCaseInput, out strSPQuery, out listParam);
var AcctLst = rep.ExecuteStoredProcedure<createcaseoutput>(strSPQuery, listParam).ToList();
if (!string.IsNullOrEmpty(AcctLst.ElementAt(0).o_case_seq.ToString()))
{
await saveCaseSearch(SaveCaseSearchInput, AcctLst.ElementAt(0).o_case_seq);
}
console.writeline("Async called");
return AcctLst;
}
public async Task<ilist<savecasesearchoutput>> saveCaseSearch(SaveCaseSearchInput SaveCaseSearchInput,Int64? case_key)
{
..........................
SQL.CaseSQL.getSaveCaseSearchParameters(SaveCaseSearchInput, case_key, out strSPQuery, out listParam);
var AcctLst = await rep.ExecuteStoredProcedureAsync<entities.case.savecasesearchoutput>(strSPQuery, listParam);
return AcctLst;
}
Здесь также createCase
встречается ожидание и
он должен немедленно вернуться прямо и выполнить самую следующую строку и напечатать Async called
до того, как даже SaveCaseSearch завершится правильно?
Хорошо, если я думаю громко, это может быть control returns to the caller
.
Точно так же, если я завершу свой вызов SavCaseSearch
внутри другого метода async/await с именем предположим
async DoWork() {....
}
и назовите это DoWork()
из CreateCase()
напрямую, затем
It will go on printing "Async called" once call to DoWork() encounters await and before it even completes ?
Думаю ли я правильно?
Также иногда я вижу и путаюсь между
await someAsync()
и
await Task.Run(() => someAsync())
..
какая разница между ними? и какой из них следует?