Temelde aynı şey olduklarını düşündüm - görevleri işlemciler arasında bölen programlar (2+ işlemcisi olan makinelerde). Sonra okuyorum bu , hangi diyor ki:
Async yöntemlerinin, engellemeyen işlemler olması amaçlanmıştır. Zaman uyumsuz bir yöntemde bekleyen bir ifade, beklenen görev çalışırken geçerli iş parçacığını engellemez. Bunun yerine, ifade yöntemin geri kalanını bir devamı olarak kaydeder ve denetimi asenkron yönteminin arayanına döndürür.
Zaman uyumsuz ve beklenen anahtar kelimeler ek iş parçacıklarının oluşturulmasına neden olmaz. Eşzamansız yöntemler kendi iş parçacığında çalışmadığından, eşzamansız yöntemler çoklu iş parçacığı gerektirmez. Yöntem geçerli eşitleme bağlamında çalışır ve iş parçacığındaki zamanı yalnızca yöntem etkin olduğunda kullanır. CPU'ya bağlı çalışmayı bir arka plan iş parçacığına taşımak için Task.Run komutunu kullanabilirsiniz, ancak arka plan iş parçacığı, yalnızca sonuçların kullanılabilir olmasını bekleyen bir işlem için yardımcı olmaz.
ve birisinin bunu benim için İngilizceye çevirip çeviremeyeceğini merak ediyorum. Eşzamansızlık (bu bir kelime mi?) Ve iş parçacığı arasında bir ayrım çiziyor ve eşzamansız görevleri olan ancak çok iş parçacıklı olmayan bir programa sahip olabileceğiniz anlamına geliyor.
Şimdi pg'deki örnek gibi asenkron görevler fikrini anlıyorum. 467. Jon Skeet'in C # Derinliği, Üçüncü Baskı
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();
}
}
async
Anahtar kelime aracı " Bu işlev, bu çağrıldığında, çağrı çağrılacak sonra tamamlama her şey için gerekli olduğu bir bağlamda denilen edilmeyecektir."
Başka bir deyişle, bir görevin ortasında yazmak
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
, çünkü DisplayWebsiteLength()
hiçbir ilgisi yoktur x
veya y
, DisplayWebsiteLength()
"arka planda" yürütülmesine neden olur , gibi
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
Açıkçası bu aptalca bir örnek, ama doğru muyum yoksa tamamen kafam karıştı mı yoksa ne?
(Ayrıca, ben neden karıştı sender
ve e
şimdiye yukarıdaki fonksiyonun gövdesinde kullanılmaz.)
sender
ve e
bunun aslında bir olay işleyici olduğunu öne sürüyoruz - hemen hemen async void
arzu edilen tek yer . Büyük olasılıkla, bu bir düğme tıklaması veya benzeri bir şeyle çağrılır - sonuç, bu eylemin uygulamanın geri kalanına göre tamamen eşzamansız olarak gerçekleşmesidir. Ama yine de hepsi tek bir iş parçacığında - UI iş parçacığı (UI iş parçacığına geri arama gönderen bir IOCP iş parçacığında küçük bir zaman şeridi ile).
DisplayWebsiteLength
Kod örneği hakkında çok önemli bir not : HttpClient
Bir using
deyimde kullanmamalısınız - Ağır bir yük altında, kod kullanılabilir soket sayısını tüketerek SocketException hatalarına neden olabilir. Uygunsuz Instantiation hakkında daha fazla bilgi .