2011-07-01 17 views

答えて

13

2.

申し訳ありませんが、.NETのために私はあなたがタスクを書き換えたいいけないと知っているが、実際には、Taskオブジェクトのように動作するクロージャを使用して、かなり単純なものを作成することができます。これは私が使用するものです。

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

そのあなたが合格デリゲートに()でBeginInvokeを呼び出し、渡された関数の結果のためにブロックして待機と呼ばれるその関数を返す関数あなたは思います。もちろん、さまざまなメソッドシグネチャに対してこの関数のオーバーロードを作成する必要があります。

あなたのニーズに合わせてこれを調整し、Continuationsなどのような他の動作も追加できます。鍵はクロージャと匿名の代理人を使用することです。 .NET 2.0で動作するはずです。

EDIT - ここでは、あなたがそれを使用する方法である:

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

ありがとうSean。これは良い出発点です。 –

+0

コードを歩き回っている人のために、BeginInvokeは上記のようにHelloWorldを[マネージスレッドプールの新しいスレッド]で起動します(http://stackoverflow.com/questions/3556634/does-funct-begininvoke-use-the-threadpool )。 – rkagerer

4
あなたは System.Threading.Threadクラスを使用する必要があります

には、.NET 3.5のためTaskクラスを取得することができなく

+0

私はTaskクラスは、私は3.5の下でそれを使用することができますどのように.NET 4に付属しているという印象の下にありましたか? –

+2

[Rx](http://go.microsoft.com/fwlink/?LinkID=179929)チームは、.NET 3.5 SP1に「タスク」やその他の低レベルの抽象化(TPL全体ではない)をバックポートしました。 –

+0

@Christial Schwarz、Stephenが言ったように^^、バックポートされました。 – Jethro

関連する問題