2011-12-20 14 views
12

私は、リソースを取得するクラスを用意しています。 クラスがリソースを取得するための非同期メソッドを公開します。タスクを使用して条件付きでコードを非同期で実行する方法

public Task<object> GetResourceAsync(string resourceName) 
{ 
    return Task.Factory.StartNew<object>(() => 
    { 
     // look in cache 

     // if not found, get from disk 

     // return resource 
    }); 
} 

クライアントコードは、次のようになります。

myResourceProvider.GetResourceAsync("myResource") 
    .ContinueWith<object>(t => Console.WriteLine("Got resource " + t.Result.ToString())); 

この方法では、バックグラウンドスレッドが常に使用されます。しかし、オブジェクトがキャッシュ内に見つかった場合、コードを非同期に実行する必要はありません。 キャッシュ内に見つかった場合は、すぐにリソースを返したいので、別のスレッドを使用する必要はありません。

ありがとうございました。

答えて

19

.NET 4.5を使用すると、Task<T>を返すことができますが、代わりにスレッドプールのスレッド上で、デリゲートを実行するので、それが明示的にタスクの戻り値を設定しますTask.FromResultを持っています。あなたのコードの文脈でそう

public Task<object> AsyncGetResource(string resourceName) 
{ 
    object valueFromCache; 
    if (_myCache.TryGetValue(resourceName, out valueFromCache)) { 
     return Task.FromResult(valueFromCache); 
    } 
    return Task.Factory.StartNew<object>(() => 
    { 
     // get from disk 
     // add to cache 
     // return resource 
    }); 
} 

あなたは.NET 4.0に残っている場合は、あなたが同じことを行うためにTaskCompletionSource<T>を使用することができます。

var tcs = new TaskCompletionSource<object>(); 
tcs.SetResult(...item from cache...); 
return tcs.Task; 
+0

これはまさに私です探していたありがとう! –

+0

+1私はこの質問をしていましたが(http://stackoverflow.com/questions/15316613/real-life-scenarios-for-using-taskcompletionsourcet)、今私はそれをいつ使うべきかを見ることができます。 –

+0

@joe Task.FromResultのこのコードを拡張して(解決策を追加してください) –

関連する問題