Każdy post na blogu, który przeczytałem, mówi ci, jak korzystać z metody asynchronicznej w języku C #, ale z jakiegoś dziwnego powodu nigdy nie wyjaśniaj, jak zbudować własne metody asynchroniczne. Mam teraz ten kod, który zużywa moją metodę:
private async void button1_Click(object sender, EventArgs e)
{
var now = await CountToAsync(1000);
label1.Text = now.ToString();
}
I napisałem tę metodę, która jest CountToAsync
:
private Task<DateTime> CountToAsync(int num = 1000)
{
return Task.Factory.StartNew(() =>
{
for (int i = 0; i < num; i++)
{
Console.WriteLine("#{0}", i);
}
}).ContinueWith(x => DateTime.Now);
}
Czy to jest użycie Task.Factory
najlepszego sposobu na napisanie metody asynchronicznej, czy powinienem napisać to w inny sposób?
c#
async-await
c#-5.0
Khalid Abuhakmeh
źródło
źródło
Odpowiedzi:
Nie polecam,
StartNew
chyba że potrzebujesz takiego poziomu złożoności.Jeśli metoda asynchroniczna jest zależna od innych metod asynchronicznych, najłatwiejszym sposobem jest użycie
async
słowa kluczowego:Jeśli Twoja metoda asynchroniczna wykonuje pracę procesora, powinieneś użyć
Task.Run
:Pomocne może okazać się moje
async
/await
wprowadzenie .źródło
TaskFactory.FromAsync
do zawijaniaBeginInvoke
. Nie jestem pewien, co masz na myśli przez „kod zwrotny”; możesz napisać własne pytanie z kodem.Task.Delay
powrocie?await
to „asynchroniczne oczekiwanie”, więc nie przechodzi do następnej iteracji, dopóki zadanie nie zostanieTask.Delay
zakończone przez .Jeśli nie chcesz używać async / await w swojej metodzie, ale nadal „dekorujesz” ją, aby móc użyć słowa kluczowego „czekaj” z zewnątrz, TaskCompletionSource.cs :
Stąd i tutaj
Widziałem, że jest również używany w źródle .NET np. WebClient.cs :
Wreszcie znalazłem przydatne również następujące:
Wprowadzenie do Async / Await na ASP.NET
Jeśli celem jest poprawa skalowalności (a nie responsywności), wszystko zależy od istnienia zewnętrznego wejścia / wyjścia, który daje taką możliwość.
źródło
Jednym bardzo prostym sposobem na uczynienie metody asynchroniczną jest użycie metody Task.Yield (). Jak stwierdza MSDN:
Wstaw go na początku metody, a następnie natychmiast powróci do programu wywołującego i dokończy resztę metody w innym wątku.
źródło
Task.Yield()
to rzeczywiście przydatne w przypadkach, w których chcesz mieć pewność, że zwrócone produktyTask
nie zostaną natychmiast ukończone po utworzeniu.