2016-03-23 18 views
3

varsayalım yeni görev yumurtlamaya. Ben konuları kullanmaya alışkınım, bu yüzden bir iş parçacığı üzerinde çalıştırmak için bir yoludur:C# Bu işlevi var

new Thread(DoWork).Start(); 

Ben

async Task DoWork() 
{ 
    await Task.Run(delegate() { /*do stuff*/}); 
} 
yöntemi modifiye yüzden yeni task/await C# özelliğini öğrenmeye çalışıyorum

Şimdi ben bu şekilde kullanabilirsiniz:

DoWork().Wait(0); 

Yoksa ben tekrar yöntemini değiştirebilirsiniz:

async void DoWork() 
{ 
    await Task.Run(delegate() { /*do stuff*/}); 
} 

Ve şimdi sadece çağrı:

DoWork(); 

Hangi çözüm kullanmalıyım? Görevin sonucuna veya bitmesinin beklenmesine ihtiyacım yok.

+0

Bu videoyu oldukça yararlı buldum: https://www.youtube.com/watch?v=6_GTdR0gBVE –

+1

bilgi için başvuru kaynağı olarak http://blog.stephencleary.com/2014/04/a-tour-of -task-part-0-overview.html – Vikas

+1

Eğer görevin sonucuna veya bitmesini beklemenize gerek yoksa - async/aw kullanma nedeniniz nedir? ait'? Görevi çalıştırabilir ve bunu unutabilirsiniz: Görev =. (() => {/ * Şeyler yap * /}). Görev sonlandırıldıktan sonra bir iş yapmanız gerektiğinde, "async/await" yararlıdır. –

cevap

4

Yanıt, ne de. Senkronize mantık etrafında önemsiz bir asenkron sarıcı oluşturuyorsunuz.

Stephen Cleary: using Task.Run for asynchronous wrappers is a code smell

Stephen Toub (Microsoft): Should I expose asynchronous wrappers for synchronous methods? (ve hayır, yapmamalısın).

DoWork yönteminizin async kısmı hiçbir değer eklemez. API'ınızın değerini, potansiyel olarak karmaşık olan "işlerinizi" mantığını, yangın ve unutmanın dışında herhangi bir şekilde yürütmeyi imkansız hale getirerek imkânsız hale getirir.

doğru yaklaşım çıplak temel Task.Run hendek ve yöntemi ortaya şerit etmektir:

void DoWork() 
{ 
    // Do long CPU-bound work, synchronously 
} 

... 

// Then, somewhere in the calling code: 
Task.Run(() => DoWork()); // Fire and forget unless you await the resulting Task or block on it. 

Task.Run

(NET 4.6.x itibariyle) şu anda parçacığı havuzu üzerinde zamanlama iş için tercih edilen yöntemdir

+2

+1. Ayrıca, eğer * gerçekten * yangın ve unutmayı istiyorsan (ki bu * aslında * vakaların% 90'ı * insanlar * soracak ve unutacaksın), 'var 'yaparak uyarıdan kaçınabilirsiniz = Görev.Run (() => DoWork()); ' –