Okay Mam nadzieję, że mam podstawy asynchroniczne/czekam, ale wciąż niektóre pytania pozostają w mojej głowie.Async/Await VS Task.Run: Kiedy używać? Jak używać?
Ale teraz to jest problem, o którym mówię. Załóżmy, że w tym prostym przykładzie
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");
}
Główny gwint nadal trwa i drukuje Main Thread
po wywołaniu metody() i czeka na napotkaniu przez 8 sekund.
Tak więc metoda() wraca do dzwoniącego, tj. Do głównej funkcji tutaj, gdy napotka oczekiwanie, zapisuje kontekst synchronizacji i kontynuuje wykonywanie z tego miejsca.
Drukuje najpierw Main Thread
.
Następnie po upływie 8 sekund wydrukuj, Long Task
, a następnie New Thread
.
Ta część mam. Moje pytanie jest, w mojej aplikacji:
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;
}
Tutaj również createCase
napotyka czekają i powinien wrócić natychmiast w prawo i wykonać sam bardzo następnego wiersza i drukować Async called
zanim nawet SaveCaseSearch uzupełnia prawo?
OK, jeśli myślę głośno, może to być control returns to the caller
.
Więc jest to jak gdybym owinąć moje wezwanie SavCaseSearch
wewnątrz innego async/czekają metoda nazwana przypuszczać
async DoWork() {....
}
i nazywają to DoWork()
z CreateCase()
bezpośrednio więc wtedy
It will go on printing "Async called" once call to DoWork() encounters await and before it even completes ?
ja myślę w prawidłowy sposób?
czasami widzę i się mylić między
await someAsync()
i
await Task.Run(() => someAsync())
..
jaka jest różnica między nimi? i do którego należy podążać?
Jeśli próbujesz użyć 'async' w aplikacji konsoli, możesz napotkać problemy, chyba że ustawisz je poprawnie, może nie zachowywać się zgodnie z oczekiwaniami w inny sposób. Zobacz http://anthonysteele.co.uk/async-and-await-with-console-apps i http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx –
' async' to [nie dotyczy wątków] (http://stackoverflow.com/q/17661428/11683). – GSerg
Zapoznaj się ze Stephen Cleary post o tym. Bardzo przydatne – Ian