2011-02-18 6 views
5

BeginDoSomething ve EndDoSomething yöntemlerinin uygulanmasını gerektiren bir arabirim uygularım. Ancak benim DoSomething gerçekten uzun süredir çalışmıyor. Kolaylık olması açısından sadece iki değişken karşılaştırır DoSomething varsayalım ve dönüş olmadığını a> b gibi Hemen tamamlayan bir IAsyncResult nasıl oluşturulur?

Yani benim BeginDoSomething olmalıdır: Ben dönmelidir bilmiyorum

protected override IAsyncResult BeginDoSomething(int a, int b, AsyncCallback callback, object state) 
{ 
    bool returnValue = a > b; 
    return ...; //what should I return here? 
    //The method actually already completed and I don't need to wait for anything 
} 

. Sadece BeginDoSomething uygularım çünkü benim yöntemim uzun sürüyor. Kendi IAsyncResult'umu uygulamam gerekiyor mu? .NET kitaplıklarında zaten bir uygulama var mı?

cevap

3

hızlı kesmek: O zaman bu gibi BeginDoSomething kullanmak

public class MyAsyncResult : IAsyncResult 
    { 
     bool _result; 

     public MyAsyncResult(bool result) 
     { 
      _result = result; 
     } 

     public bool IsCompleted 
     { 
      get { return true; } 
     } 

     public WaitHandle AsyncWaitHandle 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public object AsyncState 
     { 
      get { return _result; } 
     } 

     public bool CompletedSynchronously 
     { 
      get { return true; } 
     } 
    } 

Bunu yapmanın yolu, bir temsilci kullanmaktır: bu yaklaşımın olumsuz tarafı, Aynı anda iki konu bu yöntemi çağırıyorsa dikkatli olmanız gerekir, bir hata alırsınız.

+0

Aslında hızlı değil, basitlikle tartışmak zor. Returnout değerini atla. Ben hatayı göremiyorum. –

+0

"EndDoSomething" de ne olmalı? Özür dilerim, End2'deki eşzamansız programlama –

+0

'da çok yeniyim. Func.BeginInvoke: IAsyncResult ile aynı olurdu, bu nedenle de sorumluluğu Delegenin uygulamasına devrediyorsunuz. – Henrik

5

Bu biraz hızlı ve kirli, ama şöyle IAsyncResult uygulayan bir sınıf uygulayabilirsiniz:

return new MyAsyncResult(a > b); 
+2

"AsyncWaitHandle" özelliğinin bir * set * 'ManualResetEvent' (veya benzeri) kümesine bir başvuru döndürmesi gerektiğini düşünüyorum. Müşterilerin, beklemede beklemeyi denemesi ve bu durumun bir istisnanın atılmasına neden olmaması makul. – Ani

+0

Doğru, bunu yapabiliriz, ancak bir WaitHandle pahalı bir nesne olduğundan, ** asla ** ilgili olmayacağı zaman bir tane yaratmanın israfı görünür. –

+2

Kod, geri arama çağrısı eksik, gerekli (boş değilse). –

İlgili konular