2011-07-01 21 views

cevap

13

2.

Maalesef .net için ben size Görevi yeniden yazmak istemiyorum söyledi biliyorum ama Aslında bir Görev nesnesi gibi davranan kapaklar kullanarak oldukça basit bir şey yaratabilirsiniz. .

public delegate R AsyncTask<R>(); 

    public static AsyncTask<R> BeginTask<R>(AsyncTask<R> function) 
    { 
     R retv = default(R); 
     bool completed = false; 

     object sync = new object(); 

     IAsyncResult asyncResult = function.BeginInvoke(
       iAsyncResult => 
       { 
        lock (sync) 
        { 
         completed = true; 
         retv = function.EndInvoke(iAsyncResult); 
         Monitor.Pulse(sync); 
        } 
       }, null); 

     return delegate 
     { 
      lock (sync) 
      { 
       if (!completed)    
       { 
        Monitor.Wait(sync); 
       } 
       return retv; 
      } 
     }; 
    } 

Onun içinde geçmesi temsilci üzerinde BeginInvoke() çağırır ve blokları denilen ve geçirilen fonksiyonun sonucu için bekleyeceği bir işlevi döndüren bir fonksiyon Sen ediyorum: Bu benim kullandığım budur Tabii ki, farklı yöntem imzaları için bu fonksiyonun aşırı yüklenmesini oluşturmak zorunda.

Gitmenin bir yolu, bunu gereksinimlerinize göre ayarlayabilir ve Devamlar vb. Gibi başka davranışlar da ekleyebilirsiniz. Anahtar, kapatma ve anonim temsilciler kullanmaktır. .NET 2.0 çalışmalıdır.

DÜZENLEME - Burada kullanmak görecektir:

public static string HelloWorld() 
    { 
     return "Hello World!"; 
    } 

    static void Main(string[] args) 
    { 
     var task = BeginTask(HelloWorld); // non-blocking call 

     string result = task(); // block and wait 

    } 
+0

Teşekkürler Sean. Bu iyi bir başlangıç ​​noktasıdır. –

+0

Kodda yürürlüğe giren herkes için, yukarıda kullanıldığı şekliyle BeginInvoke, [işlenen yönetilen iş parçacığından yeni bir iş parçacığı] üzerinde HelloWorld'ü başlattığını unutmayın (http://stackoverflow.com/questions/3556634/does-funct-begininvoke-use-the-threadpool). – rkagerer

4
Sen System.Threading.Thread sınıfını kullanmak zorunda olacak

, sen .net 3.5 için Task sınıfını alabilirsiniz ama

+0

Ben Görev sınıf I 3.5 altında kullanabiliriz nasıl .NET 4. ile geliyor izlenim oldu? –

+2

[Rx] (http://go.microsoft.com/fwlink/?LinkID=179929) ekibi, .NET 3.5 SP1'e "Task" ve diğer düşük düzeyli soyutlamaları (tüm TPL'yi değil) destekledi. –

+0

@Christial Schwarz,^^^Stephen'ın söylediği gibi, geri verildi. – Jethro

İlgili konular