Setiap posting blog yang saya baca memberi tahu Anda cara mengonsumsi metode asinkron dalam C #, tetapi untuk beberapa alasan aneh tidak pernah menjelaskan cara membangun metode asinkron Anda sendiri untuk dikonsumsi. Jadi saya memiliki kode ini sekarang yang menggunakan metode saya:
private async void button1_Click(object sender, EventArgs e)
{
var now = await CountToAsync(1000);
label1.Text = now.ToString();
}
Dan saya menulis metode ini yaitu 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);
}
Apakah ini, penggunaan Task.Factory
, cara terbaik untuk menulis metode asinkron, atau haruskah saya menulis dengan cara lain?
c#
async-await
c#-5.0
Khalid Abuhakmeh
sumber
sumber
Jawaban:
Saya tidak menyarankan
StartNew
kecuali Anda membutuhkan tingkat kompleksitas itu.Jika metode async Anda bergantung pada metode async lainnya, pendekatan termudah adalah menggunakan
async
kata kunci:Jika metode async Anda melakukan pekerjaan CPU, Anda harus menggunakan
Task.Run
:Anda mungkin menemukan
async
/await
intro saya bermanfaat.sumber
TaskFactory.FromAsync
untuk membungkusBeginInvoke
. Tidak yakin apa yang Anda maksud tentang "kode panggilan balik"; jangan ragu untuk mengirimkan pertanyaan Anda sendiri dengan kode.Task.Delay
pengembalian?await
adalah "asynchronous wait", jadi tidak melanjutkan ke iterasi berikutnya sampai setelah tugas dikembalikan denganTask.Delay
selesai.Jika Anda tidak ingin menggunakan async / menunggu di dalam metode Anda, tetapi masih "hiasi" itu agar dapat menggunakan kata kunci tunggu dari luar, TaskCompletionSource.cs :
Dari sini dan sini
Saya melihat juga digunakan dalam sumber NET misalnya. WebClient.cs :
Akhirnya, saya menemukan berguna juga sebagai berikut:
Pengantar Async / Menunggu di ASP.NET
Jika targetnya adalah untuk meningkatkan skalabilitas (bukan responsif), semuanya bergantung pada keberadaan I / O eksternal yang memberikan peluang untuk melakukan itu.
sumber
Salah satu cara yang sangat sederhana untuk membuat metode asinkron adalah dengan menggunakan metode Task.Yield (). Seperti yang dinyatakan MSDN:
Masukkan di awal metode Anda dan kemudian akan segera kembali ke pemanggil dan menyelesaikan sisa metode di utas lainnya.
sumber
Task.Yield()
memang berguna, untuk kasus-kasus yang Anda ingin memastikan bahwa yang dikembalikanTask
tidak akan segera selesai pada saat penciptaan.