Eşzamansız / İş Parçacıklarına Karşı Bekleyin


101

.Net 4.5'te Microsoft, Async/Awaiteşzamansız kodlamayı basitleştirmek için yeni özelliği ekledi . Ancak merak ediyorum

  1. Can Async/Awaittamamen kullanmanın eski yol yerine Threads?
  2. A eşzamansız olarak yapabilecek Async/Awaither şeyi Threadyapabilir mi?
  3. Can Async/Awaitgibi bazı yöntemlerle kullanılmalıdır WebClient.DownloadStringAsyncveya bunu kullanmak için herhangi senkron yöntemi dönüştürebilir Async/Awaitve ana iş parçacığı engellemek için olmasın?

2
İş Parçacıkları ve Async / Await, ilgisiz özelliklerdir. Onları birleştirebilirsin ama zorunda değilsin.
dtb

2
Async / Await'in de aynı şeyi yaptığını sanıyordum new Thread(() => {Some Work}).Start();? değil mi?
Roman Ratskey 01

2
Hayır! Varsayımınız doğru değil. Genellikle Async / Await ile birleştirilen, ancak aynı zamanda ilgisiz olan ve onunla kullanılması gerekmeyen Task.Run (TPL) ' yi düşünüyor olabilirsiniz .
dtb

4
@dtb: Peki Async / Await ne zaman kullanılır ve Threads ne zaman kullanılır? Task.Run, Thread.Start, Async / Await arasındaki fark konusunda kafam gerçekten karıştı. Bana aralarındaki farkları anlamamı sağlayan iyi bir açıklama sunabilirseniz çok minnettar
olurum

2
Async / await iş parçacığı oluşturmaz veya başka bir şekilde kullanmaz.
wRAR

Yanıtlar:


83

Threads kullanmanın eski yöntemini tamamen değiştirebilir mi?

Hayır. Bir ileti dizisi çok daha yararlı şeyler yapabilir. Await, özellikle zaman alan bir şeyle , genellikle bir G / Ç isteğiyle başa çıkmak için tasarlanmıştır . Geleneksel olarak, G / Ç isteği tamamlandığında bir geri arama ile yapılırdı. Bu geri aramalara dayanan kod yazmak oldukça zordur, beklemek onu büyük ölçüde basitleştirir.

Bir İş Parçacığının eşzamansız olarak yapabildiği şeyleri yapabilecek mi?

Kabaca. Await sadece gecikmeyle ilgilenir, aksi takdirde bir iş parçacığının yaptığı hiçbir şeyi yapmaz. Await anahtar kelimesinin sağında yer alan bekleme ifadesi , işi yapan şeydir. İdeal olarak, bir iş parçacığı kullanmaz, bir sürücü isteği gönderir ve sürücü veri aktarımını tamamladığında bir tamamlanma bildirimi geri araması oluşturur. Ağ iletişimi, en yaygın kullanımdır, yüzlerce milisaniyelik gecikmeler yaygındır ve masaüstünden veya LAN'dan "buluta" taşınan hizmetlerin kaçınılmaz bir yan etkisi vardır. Bu tür hizmetleri eşzamanlı olarak kullanmak, bir kullanıcı arayüzünü oldukça tepkisiz hale getirir.

yalnızca WebClient.DownloadStringAsync gibi bazı yöntemlerle kullanılabilir

Hayır. Bir Görev döndüren herhangi bir yöntemle kullanabilirsiniz. XxxxAsync () yöntemleri, zaman alan genel işlemler için .NET çerçevesinde önceden pişirilmiş yöntemlerdir. Bir web sunucusundan veri indirmek gibi.


4
Modern C # açısından, harici API'lerde Async-Callbacks elde etmek için en iyi yaklaşım nedir?
bonCodigo

5
Son paragrafta anlatılan bir Görev kullanın.
Hans Passant

Örnek olarak eşzamansız programlama yoluyla yapılamayan bir iş parçacığının yapabileceği bir şey beklerdim.
Saeed Neamati

1
"Bir ileti dizisi çok daha yararlı şeyler yapabilir" konusunu açabilir misiniz? Konuların asyncuygun olmadığı özellikleri anlamak faydalı olacaktır .
Benjohn

1
await Task.Runİşlemciye bağlı çalışma için bahsetmeye değer . Doğru anlarsam, bu bazen bir kişinin yapacağı bir iş parçacığı veya bir arka plan çalışanı oluşturacağını başarır.
ToolmakerSteve

16

Bununla ilgili resmi açıklama. Yine de bir şeyi diğerleriyle körü körüne değiştirmeden önce iş parçacıkları ve eşzamansız programlama arasındaki farkları anlamanız gerekir.


Bu, Threads ve Async / Await hakkında okuduğum ilk kaynak gibi açık ve öz.
Arman Bimatov

2
Bu cevap yalnızca belgelere bir bağlantı içerir. Bağlantının modası geçmiş olabileceğinden, yanıt da modası geçmiş - veya daha da kötüsü - tamamen işe yaramaz hale gelebilir. Stack kullanıcılarını, bağlantıların ilgili kısımlarını doğrudan kendi sorularına göndermeye teşvik ediyoruz.
HimBromBeere

1
Ne yazık ki, resmi açıklama ne zaman yapılacağını açıklamıyor await Task.Run. Task.Run'dan kısa bir söz var, ancak net değil. Sonuç olarak, awaitcpu'ya bağlı bir görevi paralel olarak çalıştırmaz, bu nedenle bu tür işler aracılığıyla yapılmalıdır await Task.Run.
ToolmakerSteve

2

Bunu bu şekilde düşünüyorum (ve https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/hh191443(v=vs.110 adresine bakarsanız Microsoft'un da düşündüğünü düşünüyorum. ) #threads )

Async / await, ana uygulama iş parçacığında bazı kodları çalıştırmanın hızlı bir yoludur; bunun avantajı, kodun yapacak işi olmadığında kendisini askıya alabilir ve odağı ana iş parçacığına, oradayken ana iş parçacığına "uyandır" elde edilecek bir sonuçtur ve daha sonra işlemeyi - tahmin ettiniz - ana iş parçacığına geri aktarın. Bunu, Basic'te denetimi belirli bir yürütme satırına ileri geri aktarabilen olay tabanlı bir GOTO ifadesi gibi düşünün.

Aksine, bir iş parçacığı, kendi değişkenleri vb. İle çalışabilen ayrı bir yürütme akışıdır; burada - yeterli donanım sağlandığında - yürütme, ana iş parçacığına paralel olarak gerçekleşir.

Tek bir dosya indirecek bir GUI uygulamanız varsa ve indirildiğinde bu dosya ile bir şeyler yaparsanız - bunu bir zaman uyumsuz / bekleme yöntemi kullanarak uygulardım.

Bununla birlikte, GUI'nizin 5000 dosya indirmesi gerekiyorsa - dosyaları indirmek için yürütme aktarılırken ana GUI iş parçacığı donabileceğinden, bunu işlemek için bir dosya indirme dizisi oluşturabilirim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.