2011-12-18 15 views
6

StartInvoke() yöntemi, eşzamansız yöntemleri çağırdığında bir temsilcide BeginInvoke() yöntemi çağrısının anlaşılmasında biraz sorun yaşıyorum. Görevlerin tamamlanmasının ardından, neden BeginInvoke() yönteminin geri dönüş değerini döndüremediğinden, neden EndInvoke gerek() BeginInvoke() öğesini sorgulamak ve ondan geri dönüş değerini döndürmek. ben bu iyi bir sorgu olmayabilir biliyorum ama benim karışıklık gerçek :-)neden delege içinde eşzamansız çağrının değerini döndürmek için EndInvoke() gerekiyor?

ektir: temsilci eşleştirme yöntemi (o varsayalım zaman ben şimdi, uyumsuz DelagateName.BeginInvoke (parametreler) kullanarak bir yöntemini çağırabilirsiniz bir değer döndürür) çalışmayı bitirir ve bir değer döndürür, neden dönüş değerini almak için DelegateName.EndInvoke() öğesine ihtiyacım var? İlk çağrının kendisi neden tamamlanmadığına dair geri dönüş yapamaz.

cevap

8

BeginInvoke döndüğünde, yöntem bitmedi - bu, asenkronize olmanın tüm noktası. Yani BeginInvoke sadece bir noktada bir sonucun "vaadini" temsil eden bir belirteç verebilir - ve bu genellikle, bir geri aramada EndInvoke kullanarak gerçek sonucunu elde etmek için bu sözü kullanırsınız.

.NET 4'te bu, Task ve Task<T> kullanarak daha hoş bir şekilde kapsüllenir, ancak jenerikler .NET 1'in bir parçası değildi, dolayısıyla delegeler için biraz daha kıvrık bir yaklaşım değildi.

+0

Teşekkürler Jon, bu gerçekten benim sorgumu çözüyor :-), Layman'ın dilinde düşünüyorum BeginInvoke çağrı almaktan ve İşi ele alma sözü ile kontrolü geri vermekten geçiyor, bu yüzden artık herhangi bir iş yapamaz Bu nedenle, EndInvoke() bu işi daha sonra yapmak için kabul edilecektir ... (Sanırım doğru düşünüyorum!) – mohits00691

+0

@ mohits00691: Tam olarak nasıl ifade edeceğimi, ama bence doğru bir fikre sahipsiniz :) –

+0

Teşekkürler Jon, bu şüpheyi temizlemek için bana çok yardımcı oldu, sanırım zamanla daha fazla dalış yapmaya devam edeceğim, herkese çok teşekkürler. – mohits00691

8

Temsilciyi eşzamansız olarak çağırmak istiyorsanız, yalnızca BeginInvoke ve eşleştirme EndInvoke'a ihtiyacınız var, yani geçerli iş parçacığını engellemez. Bu, uzun süre çalışan yöntemler veya denetlemediğiniz süreçleri çağıran yöntemler için yararlıdır. uygulama sınırları boyunca.

Açıkladığınızdan, aynı yöntemdeki değeri döndüren Invoke yöntemini kullanarak daha iyi olabilir - ve aynı iş parçacığında eşzamanlı olarak. Bu örnekte, iş parçacığınız uzun süren bir işlem tarafından engellenebilir. Ne yapmaya çalıştığın buna bağlı.

İlgili konular