問題タブ [task-parallel-library]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - BackgroundWorker のタスク並列ライブラリの置き換え?
タスク並列ライブラリには、BackgroundWorker クラスの代替または改善と見なされるものはありますか?
ウィザード スタイルの UI を備えた WinForms アプリケーションがあり、実行時間の長いタスクをいくつか実行しています。標準の進行状況バーと操作をキャンセルできるレスポンシブ UI が必要です。以前に BackgroundWorker でこれを行ったことがありますが、代わりに使用できる TPL パターンがあるかどうか疑問に思っていますか?
c# - デバッグがデバッグなしで実行することと異なるのはなぜですか (タスクのキャンセル)?
C# 4.0 で並列プログラミングをテストするプログラムを作成しました。しかし、問題があり、その理由がわかりません。
メソッドを書きます
別のスレッド (UI スレッド以外) で実行されます。
そして機能(簡略化)
問題は、tokenSource がキャンセルされると、catch ブロックが存在しないかのように、"OperationCanceledException is not handler by user code" というエラーが発生することです。私のコードは教科書や MSDN のコードと似ているため、その理由はわかりません。
ありがとうございました。
編集: 私は実際に 1 か月も経たないうちに同様のプログラムを作成しましたが、そのときはすべて問題ありませんでした。今日、もう一度実行しようとしましたが、同じ問題が発生しました。プログラムの終了後に Microsoft Visual Web Developer 2010 Express をインストールしましたが、これが原因かどうかわかりません。わからない、同じコード、異なる結果。
編集:私はこの問題について考え、どこが間違っているかを見つけました。以前は「デバッグなしで実行」を使用していましたが、現在はデバッグを使用しています。デバッグなしで実行すると、問題が解決します。また、デバッグが「デバッグなしで実行」と異なる理由を教えていただければ幸いです。
.net - 単体テスト用に交換できるように、タスク並列ライブラリの周りにインターフェイスラッパーはありますか?
私は少し前にこの質問をしました。これは悪い考えであり、タスクのスケジューリングと実行のカプセル化を抽象化して、単体テストから同期スケジューラーを渡すことができるようにする必要があることを今では知っています。
現在、タスク並列ライブラリ(TPL)を使用するコードがありますITaskScheduler
。タイプに何かを挿入して、スケジューリングの責任を抽出し、テストで同期代替を渡すことができるようにしたいと思います。
そのようなものは存在しますか?Task.Factory.StartNew
ラップして何かを探していますTask.ContinueWith
。自分でロールするのはそれほど手間がかかるとは思いませんが、小さな落とし穴がたくさんあると思います。すでに利用可能なものがあれば、それを行うのに時間をかけたくありません。
multithreading - Task Parallel Library で使用されるスレッドを調整する方法はありますか?
私は TPL を使用していますが、TPL を使用するコードの単体テストが難しいと感じています。
問題が発生する可能性があると感じているため、ラッパーを導入しないようにしています。
TPL でプロセッサ アフィニティを設定できることは理解していますが、スレッドの最大値を (おそらくアプリ ドメインごとに) 設定することをお勧めします。したがって、スレッドの最大値を 1 に設定すると、TPL は使用されたスレッドを強制的に使用することになります。
どう思いますか?これは可能ですか (私はそうではないと確信しています)、それは可能であるべきですか?
編集:ここに例があります
遅延を導入しない限り、テストはおそらく合格しません。Task.MaximumThreads=1
TPLがシリアルに実行されるようにしたいと思います。
visual-studio-2010 - Visual Studio 2010 RTM で [並列タスク] ウィンドウが表示されない
並列タスク ウィンドウは、Visual Studio の [デバッグ] > [ウィンドウ] の下にある必要があります。ただし、そこには「ブレークポイント」しか表示されません。何か不足していますか?
c# - タスク並列ライブラリを使用して「1 つだけ」および「並列ではない」セマンティクスを実装する
次のように動作するキーを使用してタスクを実装するための最良のアプローチは何ですか?
オプション 1) このキーの 1 つだけが保留中です。たとえば、ASP.NET MVC から使用して、画像の URL が何回ヒットしても、サムネイル画像の単一のレンダリングをキューに入れることができます。1 つのみが実行され、他のすべての要求はその要求が完了するまで待機します。
オプション 2) 同じキーを持つすべての項目を順番に実行する必要があります。たとえば、バッキング ストアからローカル キャッシュにファイルをフェッチする操作がすべて同時にファイルをキャッシュに取得しようとしないようにするために使用できます。オプション 1 は、同じキーを持つ後続のアクションが単純に破棄される特殊なケースです (通常、ファイルの存在チェックのみを保存します)。
これらのケースの両方を処理する既存の WorkQueue があります (アパートメント状態、ThreadPriority 設定、および最大並列度も同様です)。TPL は、これを置き換えるための最良のソリューションと思われ、改善されたキャンセル オプションを提供します。
継続を伴うネストされたタスクは有望に見えますが、現在キューに入れられているタスクのディクショナリを維持することはすぐに、TaskFactory クラスと TaskScheduler クラスの間で面倒になります。TaskFactory も TaskScheduler も Task ではジェネリックではないため、Task からの継承にも問題があります。
ほとんどのタスク並列の例では、一連のタスクが事前にわかっていることを前提としています。この場合、新しいタスクが常に追加され、要求された操作と渡されたキーに応じて、破棄するか、既存のタスクにチェーンする必要があります。
TPL を使用してこれに似たものを実装した人はいますか? もしそうなら、Task、TaskScheduler、および TaskFactory クラスでどのようなアプローチを取りましたか?
c# - .NET 4のタスク並列ライブラリを使用して非同期操作をチェーンするにはどうすればよいですか?
特定のStreamオブジェクトへの書き込みなど、C#4で非同期操作をプログラムでチェーンしようとしています。私はもともとこれを「手動で」行い、ある操作から次の操作にコールバックをフックしましたが、.NET 4タスク並列ライブラリを試して、並行ホイールを再発明する手間を省くと思いました。
まず、非同期呼び出しを次のようなタスクでラップします。
継続により、同期操作の連鎖が非常に簡単になりました(不幸なメソッド名を許せば):
Task.ContinueWith
ただし、と同じ方法で非同期操作を受け入れるバージョンのメソッドはありませんTaskFactory.FromAsync
。
したがって、TPLを使い続けると仮定すると、このメソッドの正しい実装を探しています。
.net - .NET 4.0 の Task Parallel Library を使用して、すべてのタスクが終了するのを待っています
複数のスレッドが終了するのを待つより短い方法はありますか? たぶん ContinueWhenAll を使用しています...しかし、残りのコードを非同期で実行したくありません。
c - TPL を使用した構造体での wchar_t* のシリアル化
tpl を使用して、wchar_t* 文字列を含む構造体をシリアル化しようとしています。
私が持っているコードは次のようになりますが、機能していません:
中国語の「字符串」文字列を「1234」に置き換えると、「1」が出力されるだけです-構造体がchar *を使用するように定義を変更すると(そしてASCII文字のみをプッシュします)、正常に動作します。ただし、 wchar_t* 文字列を適切にシリアル化および逆シリアル化する方法がわかりません。
c# - タスクを再開しますか、それとも新しいタスクを作成しますか?
私は30〜80秒ごとに20〜50の新しいタスクを作成するプロジェクトに取り組んでいます。各タスクは10〜20秒間存続します。
したがって、タイマーを使用してこれらの新しいタスクを作成していますが、常に同じタスクを再作成するたびに、コードは次のようになります。
私の質問は、タスクを作成して再起動し続ける方法があるので、新しいタスクを開始する必要はありませんTask.Factory.StartNew(service.Execute); 毎回?
それとも、それは私が心配する必要がないことであり、新しいタスクを作成し続けても大丈夫ですか?
この種のスレッドを使用して、このシナリオでどのように作業する必要があるかについてのガイド/ベストプラクティスはありますか?