.NET 4.0には、非同期プログラミングモデルをカプセル化するnice Taskクラスが含まれているTPLがあります。私は.NET 2.0でなければならないアプリケーションに取り組んでいますが、私はタスクの書き換えを避けたいと思います。助言がありますか?.NET 2.0でタスク<T>を使用するにはどうすればよいですか?
答えて
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
}
System.Threading.Thread
クラスを使用する必要があります
には、.NET 3.5のためTask
クラスを取得することができなく
私はTaskクラスは、私は3.5の下でそれを使用することができますどのように.NET 4に付属しているという印象の下にありましたか? –
[Rx](http://go.microsoft.com/fwlink/?LinkID=179929)チームは、.NET 3.5 SP1に「タスク」やその他の低レベルの抽象化(TPL全体ではない)をバックポートしました。 –
@Christial Schwarz、Stephenが言ったように^^、バックポートされました。 – Jethro
- 1. NUnit3TestAdapterを.Net Standard 2.0で使用するにはどうすればよいですか?
- 2. .NET CF 2.0を使用してビットマップのPixelFormatを取得するにはどうすればよいですか?
- 3. .NET 2.0のDictionary <String、String>をシリアライズ/デシリアライズするにはどうすればよいですか?
- 4. .NETでスキャナを使用するにはどうすればよいですか?
- 5. 1つのアプリケーションで.NET 2.0と.NET 4.0をサポートするにはどうすればよいですか?
- 6. タスク<IEnumerable>を使用して結果を処理するにはどうすればよいですか?
- 7. フェデレーションサービスを使用せずにASP.NETでSAML 2.0を実装するにはどうすればよいですか?
- 8. .net 2.0でキャッシュされたタイムゾーン情報をクリアするにはどうすればよいですか?
- 9. .NET Coreと.NET Frameworkの両方でGetManifestResourceStreamを使用するにはどうすればよいですか?
- 10. .NET CoreのIdentityServer4を.NET 4.6で使用するにはどうすればよいですか?
- 11. playframework 2.0では、テンプレートでセッションオブジェクトを使用するにはどうすればよいですか?
- 12. .netでServiceAccountを使用してGoogle OAuth2を使用するにはどうすればよいですか?
- 13. .NETコンパクトフレームワーク2.0でmidiファイルを再生するにはどうすればよいですか?
- 14. Jenkinsのjs-test-driverタスクにリモートブラウザを使用するにはどうすればよいですか?
- 15. .NET 2.0ではどのようなDependencyInjectionコンテナを使用できますか?
- 16. UWPアプリケーションから.NET Standard 2.0クラスライブラリを参照するにはどうすればよいですか?
- 17. ASP.NET MVC 2.0でエリア内で共有ビューを使用するにはどうすればよいですか?
- 18. スケジュールされたタスクでOAuth2RestTemplateを使用するにはどうすればよいですか?
- 19. IDictionaryの値を.Net 2.0のIListオブジェクトにコピーするにはどうすればよいですか?
- 20. Androidでタスクを終了するにはどうすればよいですか?
- 21. MacにJavaFX 2.0をインストールするにはどうすればよいですか?
- 22. Ruby on Railsでrakeタスクにカスタムログを使用するにはどうすればよいですか?
- 23. LogiXMLで使用される.NETフレームワークを変更するにはどうすればよいですか?
- 24. メソッド(.NET)で使用されるフィールドを取得するにはどうすればよいですか?
- 25. .NETで使用するためにFitNesseを設定するにはどうすればよいですか?
- 26. 外部アプリでTwitterのOAuth 2.0を使用するにはどうすればよいですか?
- 27. JavaでXSLT 2.0とXSLT 3.0を使用するにはどうすればよいですか?
- 28. Jenkins 2.0 Pipelineで「Publish TAP Results」プラグインを使用するにはどうすればよいですか?
- 29. awaitを使用してカスタムTaskSchedulerでタスクを実行するにはどうすればよいですか?
- 30. TaskFactory.StartNew <Task<Result>を非同期メソッドで使用するにはどうすればよいですか?
ありがとうSean。これは良い出発点です。 –
コードを歩き回っている人のために、BeginInvokeは上記のようにHelloWorldを[マネージスレッドプールの新しいスレッド]で起動します(http://stackoverflow.com/questions/3556634/does-funct-begininvoke-use-the-threadpool )。 – rkagerer