2011-07-01 8 views

Odpowiedz

13

Wiem, mówiłeś, że nie chcą przepisać zadanie, ale możesz faktycznie stworzyć coś całkiem prostego za pomocą zamknięć, które zachowują się trochę jak obiekt Zadanie. To właśnie używam.

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; 
      } 
     }; 
    } 

Jest to funkcja, która zwraca BeginInvoke() na delegata Ci przepustkę i zwraca funkcję, która po nazwie bloki i czeka na wynik funkcji przeszedł w wy mieliście trzeba oczywiście tworzyć przeciążenia tej funkcji dla różnych metod.

Jednym ze sposobów na przejście, możesz dostosować to do swoich potrzeb i dodać inne zachowania, takie jak Kontynuacje itp. Kluczem jest użycie zamknięć i anonimowych delegatów. Powinien pracować w .NET 2.0.

EDIT - Oto jak można go używać:

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

Dzięki Sean. To dobry punkt wyjścia. –

+0

Dla każdego, kto przejdzie przez kod, należy zauważyć, że BeginInvoke, jak użyto powyżej, uruchamia HelloWorld w [nowym wątku z zarządzanej puli wątków] (http://stackoverflow.com/questions/3556634/does-funct-begininvoke-use-the-threadpool). – rkagerer

4

Będziesz musiał użyć System.Threading.Thread klasę, można uzyskać klasę Task dla .NET 3.5, ale nie dla .NET 2.

Niestety

+0

Byłem pod wrażeniem, że klasa Zadanie pochodzi z .NET 4. Jak mogę używać go pod 3.5? –

+2

Zespół [Rx] (http://go.microsoft.com/fwlink/?LinkID=179929) przesłał 'Task' i inne abstrakcje niskiego poziomu (ale nie całą TPL) do .NET 3.5 SP1. –

+0

@Christial Schwarz, ^^ jak powiedział Stephen, został przeniesiony. – Jethro