2012-07-17 16 views
9

:AsyncMethod() beklemektedir karşı bekliyoruz bekliyoruz Task.Factory.StartNew <TResult> (AsyncMethod), aşağıdaki yöntem göz önüne alındığında

public async void SomeEventHandler(EventArgs args) { 
    var myObject = await await Task.Factory.StartNew<Task<MyObject>>(DoSomethingAsync); 
    // do something with myObject 
} 

ve:

public async void SomeEventHandler(EventArgs args) { 
    var myObject = await DoSomethingAsync(); 
    // do something with myObject 
} 

public async Task<MyObject> DoSomethingAsync() { 
    // do some work 
    await OpenSomeFileAsync(); 
    return new MyObject(); 
} 

arasında bir fark var mı

DoSomethingAsync'in "bazı işlerini yap" bölümünün hemen yeni bir görevde olacağını düşünüyorum. ilk durum, ama dürüst olmak gerekirse Görevler, uyumsuzluk ve bekleyişin nasıl çalıştığını tam olarak anlamadım ve eminim ki sadece kendim için çok karmaşık şeyler yapıyorum.

DÜZENLEME:

Bu soru hakkında bu metro örneğe bakarak geldi:

var unused = Task.Factory.StartNew(async() => { // some work... }); 
// unused is of type Task<TResult> 

Deniyordum: MainPage.xaml.cs içinde Spesifik http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Target-App-e2689782

, onlar bu var anonim bir async fonksiyonu kullanmadan yeniden çalışıp, merak etmeye başladım, neden bir async metodu yazıp, StartNew'i çağırmak ve bir async fonksiyonunu kullanmak yerine neden beklemiyorsunuz?

+0

Neden bu şekilde yazmak ister? Yeni "async"/"await" anahtar kelimelerini kullanmanın tüm amacı, zorunda kalmamanızdı. –

+0

Kötü bir örnek kod parçası gibi görünüyor –

+0

Sadece kendime bir baktım ve ... Vay canına. Evet, "Resmi Windows SDK Örneği" kodu ** gerçekten kötü **! Sanırım "async" noktasını tamamen kaçırmayı başardılar! –

cevap

11

Çoğu zaman, başka bir Task eklemek yararlı değildir, ancak bazı durumlarda, olabilir. Eğer UI iş parçacığı (veya benzer bir şey) konum ve birinci bölümü (// do some work) ayrıca UI iş parçacığı üzerinde yürütmek ve böylece irade edecektir doğrudan DoSomethingAsync() yürütmek eğer

farktır yöntemin herhangi bir şekilde devamının parçaları (sürece ConfigureAwait() kullanıyorlar. Diğer taraftan, başka bir Task'u başlatırsanız, DoSomethingAsync()'un ilk kısmı ve aşağıdaki bölümleri ThreadPool üzerinde yürütülecektir.

DoSomethingAsync() Eğer başka Task size bir avantaj vermemeleri (ve daha fazla yükü dezavantaj verecektir) ekleyerek, doğru yazılır, ama bir fark yaratacak durumlar vardır hayal edebiliyorum. yerine Task.Factory.StartNew() ve iki await s kullanmanın

Ayrıca, yazabilirsiniz:

await Task.Run(DoSomethingAsync); 
+1

İyi bir nokta, beklemeden önce bölüm hakkında düşünmedim ... +1 –

+0

Çok iyi cevap, herkese teşekkürler! –

4

Evet, bir fark var: İlk formda, kesinlikle yararlı bir şey getiren ekstra bir Görev seviyeniz var.

ilk form

Buna temelde eşdeğerdir:
Task<Task<MyObject>> task1 = Task.Factory.StartNew<Task<MyObject>>(DoSomethingAsync); 
Task<MyObject>> task2 = await task1; 
var myObject = await task2; 

Yani aslında mantıklı değil: sadece ... başka bir görev oluşturan bir görev yaratıyorsun.

+0

Yanıt için teşekkürler - Ben de çok düşündüm.Bir dakikanız varsa, düzenlememe hitap edebilir misiniz? Ben baktığım örnekte alınan yaklaşım ile kafam karıştı ... –

+0

AFAICT, bu kötü bir örnek –

+0

@justin, ben James ile katılıyorum, gerçekten kötü bir örnek ... oluşturmak için bir neden yok bir uyumsuzluk yöntemiyle ilgili görev, zaten bir görev döndürdüğü için –

İlgili konular