Saya pikir mereka pada dasarnya adalah hal yang sama - menulis program yang membagi tugas antara prosesor (pada mesin yang memiliki 2+ prosesor). Lalu saya membaca ini , yang mengatakan:
Metode Async dimaksudkan sebagai operasi non-pemblokiran. Ekspresi menunggu dalam metode async tidak memblokir utas saat ini sementara tugas yang ditunggu-tunggu sedang berjalan. Sebaliknya, ekspresi mendaftar sisa metode sebagai kelanjutan dan mengembalikan kontrol ke pemanggil metode async.
Async dan menunggu kata kunci tidak menyebabkan utas tambahan dibuat. Metode Async tidak memerlukan multithreading karena metode async tidak berjalan pada utasnya sendiri. Metode ini berjalan pada konteks sinkronisasi saat ini dan menggunakan waktu pada utas hanya ketika metode ini aktif. Anda bisa menggunakan Task.Run untuk memindahkan pekerjaan yang terikat CPU ke utas latar belakang, tetapi utas latar tidak membantu proses yang hanya menunggu hasil tersedia.
dan saya bertanya-tanya apakah seseorang dapat menerjemahkannya ke bahasa Inggris untuk saya. Tampaknya menarik perbedaan antara asyncronicity (apakah itu sebuah kata?) Dan threading dan menyiratkan bahwa Anda dapat memiliki program yang memiliki tugas-tugas yang tidak sinkron tetapi tidak multithreading.
Sekarang saya mengerti ide tugas asinkron seperti contoh pada hal. 467 dari Jon Skeet's C # In Depth, Edisi Ketiga
async void DisplayWebsiteLength ( object sender, EventArgs e )
{
label.Text = "Fetching ...";
using ( HttpClient client = new HttpClient() )
{
Task<string> task = client.GetStringAsync("http://csharpindepth.com");
string text = await task;
label.Text = text.Length.ToString();
}
}
Kata async
kunci berarti " Fungsi ini, kapan pun dipanggil, tidak akan dipanggil dalam konteks di mana penyelesaiannya diperlukan untuk semua setelah panggilannya dipanggil."
Dengan kata lain, menulis itu di tengah-tengah beberapa tugas
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
, Karena DisplayWebsiteLength()
tidak ada hubungannya dengan x
atau y
, akan menyebabkan DisplayWebsiteLength()
dieksekusi "di latar belakang", seperti
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
Jelas itu contoh yang bodoh, tetapi apakah saya benar atau saya benar-benar bingung atau apa?
(Juga, saya bingung tentang mengapa sender
dan e
tidak pernah digunakan dalam tubuh fungsi di atas.)
sender
dan e
menyarankan ini sebenarnya adalah pengendali acara - cukup banyak satu-satunya tempat async void
yang diinginkan. Kemungkinan besar, ini disebut pada klik tombol atau sesuatu seperti itu - hasilnya adalah bahwa tindakan ini terjadi sepenuhnya secara tidak sinkron sehubungan dengan sisa aplikasi. Tapi itu semua masih dalam satu utas - utas UI (dengan sepotong kecil waktu pada utas IOCP yang memposting panggilan balik ke utas UI).
DisplayWebsiteLength
contoh kode: Anda tidak boleh menggunakan HttpClient
dalam using
pernyataan - Di bawah beban yang berat, kode dapat menghabiskan jumlah soket yang tersedia yang mengakibatkan kesalahan SocketException. Info lebih lanjut tentang Instansiasi yang Tidak Benar .