問題タブ [parallel-extensions]

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.

0 投票する
7 に答える
62041 参照

c# - CancellationTokenSourceをいつ破棄するのですか?

クラスCancellationTokenSourceは使い捨てです。Reflectorをざっと見てみるとKernelEvent、(非常に可能性が高い)管理されていないリソースの使用法がわかります。CancellationTokenSourceファイナライザーがないので、処分しないとGCは行いません。

一方、MSDNの記事「マネージスレッドでのキャンセル」にリストされているサンプルを見ると、トークンを破棄するコードスニペットは1つだけです。

コードでそれを処分する適切な方法は何ですか?

  1. 並列タスクを開始するコードをusing、それを待たなければラップすることはできません。そして、あなたが待たない場合にのみキャンセルをすることは理にかなっています。
  2. もちろんContinueWith、電話でタスクを追加することもできますがDispose、それはその方法ですか?
  3. 同期を取り戻さず、最後に何かを実行するキャンセル可能なPLINQクエリについてはどうでしょうか。言いましょう.ForAll(x => Console.Write(x))
  4. 再利用できますか?同じトークンを複数の呼び出しに使用して、それをホストコンポーネント、たとえばUIコントロールと一緒に破棄することはできますか?

ResetクリーンアップIsCancelRequestedとフィールド化のメソッドのようなものがないため、Token再利用できないと思います。したがって、タスク(またはPLINQクエリ)を開始するたびに、新しいタスクを作成する必要があります。それは本当ですか?Disposeはいの場合、私の質問は、これらの多くのCancellationTokenSourceインスタンスで対処するための正しく推奨される戦略は何ですか?

0 投票する
1 に答える
5037 参照

c# - 並列。ステップサイズの場合

Parallel.Forループでステップサイズを指定できるオーバーロードがあるかどうか誰かが知っていますか?c#またはVB.Netのサンプルがあれば素晴らしいでしょう。

ありがとう、ゴンザロ

0 投票する
1 に答える
470 参照

task-parallel-library - Silverligh 5 SDK RC + Async CTP : 動作させる

Silverlight 5 SDK RC をインストールしました。Async CTP を使用するプロジェクト内で使用すると問題が発生します。

AsyncCtpLibrary_Silverlight.dll と mscorlib.dll の両方に、まったく同じ名前空間にある Task タイプ (およびその他の Task 関連タイプ) が含まれています。

エラーメッセージは次のとおりです。
ここに画像の説明を入力

このあいまいさを解決するために、AsyncCtpLibrary_Silverlight.dll のエイリアスを「AsyncCtp」に変更しました。それに応じて cs ファイルを変更します。

これであいまいさの問題は解決したようですが、「async」キーワードが認識されなくなりました。関連するエラーは次のとおりです。
ここに画像の説明を入力

ここに画像の説明を入力

それを回避する方法はありますか、それとも行き止まりですか?

0 投票する
3 に答える
28211 参照

c# - タスク内で例外をスローする - "await" vs Wait()

TPL では、Task 内で例外をスローすると、AggregateException でラップされます。しかし、 awaitキーワード
を使用すると、同じことは起こりません。 その動作の説明は何ですか?

0 投票する
2 に答える
254 参照

c# - 例外がキャッチされない

私は非常に単純なアプリケーションを持っており、それにWebサイトのリストをフィードし、それらに対して並列foreachを実行し、各アクション内でhttp投稿を実行します。

以下のように:

なぜOutOfMemoryExceptionがスローされるのか、ましてやアプリケーション全体がクラッシュする理由は言うまでもなく、キャッチして続行するだけではありません。

編集:例外が発生する場所は正確にはわかりません。ローカルでは発生しないため、本番環境で実行している場合にのみ発生します...つまり、デバッグは利用できません。アプリケーションは64ビットであり、100メガバイトを超えることはめったにありません。

0 投票する
1 に答える
73 参照

c# - 並列処理によるメソッドの抽出に関する問題

次のコードを新しいメソッドに抽出したいと思います。

PSTLooperはタイプであり、他にもその方法でテストしたいものIEvaluatorがいくつかあります。IEvaluatorメソッドはできるだけ速く実行する必要があります。今のところ、Parallel.Forのパフォーマンスには非常に満足しています(より高速でより優れたメソッドについて学びたいと思います)。

スレッドごとに新しいオブジェクトを生成し、EvalEnumeration(int instance)メソッドの現在のスレッド数を生成する必要があります。これらの制約のため、いくつかの試行が失敗しました。

私の試みのいくつか:


そのアプローチはコンパイルされますが、を使用するだけでIEvaluator、新しいものは作成されません。


インスタンスの数が必要なため、コンパイルされません。


私のアプローチは最善ではないと確信していますが、今のところこれ以上のことはわからないので、ここでこの質問をする必要があります。

0 投票する
1 に答える
2837 参照

.net - 結合を使用して既存の LINQ クエリを PLINQ する方法は?

LINQ を使用して 2 つの DataSet を互いに比較し、新しい行を作成して既存のものを更新しています。完全な比較が約 1.5 時間続き、2 つのコアのうち 1 つだけがビジーであることに気付きました (タスク マネージャーは 50-52% の CPU 使用率です)。私は並列 LINQ にまったく慣れていないことを認めなければなりませんが、パフォーマンスが大幅に向上する可能性があると思います。

だから私の質問は、どのように、何を並列化する必要があるのですか?

これらは元のクエリです (本質的なものに縮小されています):

: daContactand daContactDetailsare SqlDataAdapterssourceand destareDataSetsおよびContactand and ContactDetailareDataTablesであり、すべての ContactDetail は Contact に属します。

両方のコアが 100% の CPU を使用するわけではありませんが、2 番目のコアはほとんどアイドル状態であるため、クエリを並列化するとパフォーマンスが大幅に向上すると思います。for eachチケットは互いに関連していないため、最適化するのに適した場所でもあります。したがって、複数のスレッドでループし、レコードを並行して作成/更新できると思います。しかし、PLINQ でそれを行うにはどうすればよいでしょうか。

サイドノート:コメントで述べたように、サーバーの唯一の目的はMySQLデータベース(別のサーバー上)をMS SQL-Server(同じサーバー上)と同期させることであるため、これまでのところパフォーマンスは重要な要素ではありませんこの Windows サービスとして)。これは、別のサービスによって生成されるレポートのソースとして機能します。ただし、これらのレポートは 1 日に 1 回しか生成されません。しかし、それとは別に、私は PLINQ の学習に興味を持っていました。これは優れた演習になると考えたからです。宛先 DB が空で、すべてのレコードを作成する必要がある場合にのみ、前述の 1.5 時間かかります。両方のデータベースがほぼ同期している場合、この方法にかかる時間はまだ 1 分程度です。将来的には、メール以来、パフォーマンスがより重要になりますいくつかの連絡先タイプの 1 つにすぎません (チャット + 通話は 1mil.records を超えます)。とにかく、ある種の(LINQ)データページングが必要になると思います。

何か不明な点がある場合は、それに応じて回答を更新します。前もって感謝します。


編集:これが私の調査と試みの結果です:

質問: 結合を使用して既存の LINQ クエリを "PLINQ" する方法は?

回答: 一部の LINQ 演算子はバイナリであることに注意してください。入力として 2 つの IEnumerable を取ります。Join は、そのような演算子の完璧な例です。このような場合、一番左のデータ ソースの型によって、LINQ と PLINQ のどちらが使用されるかが決まります。したがって、クエリを並列実行するには、最初のデータ ソースで AsParallel を呼び出すだけで済みます。

しかし、次の方法でクエリを変更すると ( に注意してくださいAsParallel):

AsParallelコンパイラは、正しいデータソースにも追加する必要があると文句を言うでしょう。したがって、これは VB.NET の問題またはドキュメントの不足のようです (記事は 2007 年のものです)。(推奨されるものとは別に)記事にもSystem.Concurrency.dll手動で追加する必要があると書かれているため、後者を想定していますが、実際には .NET 4.0 Framework および Namespace の一部ですSytem.Threading.Tasks

クエリはシーケンシャル モードで十分に高速であるため、並列化から利益を得られないことに気付きましたExcept(両方のコレクションの行数がほぼ同じで、比較の最大数が得られる場合でも、30 秒未満で結果が得られます)。 )。しかし、後で完全を期すために追加します。

そこでfor-each、LINQ クエリと同じくらい簡単なものを並列化することにAsParallel()しました。最後に追加するだけです。しかし、並列処理を強制する必要があることに気付きましたWithExecutionMode(ParallelExecutionMode.ForceParallelism)。そうしないと、.NET はこのループに 1 つのコアのみを使用することを決定します。また、できるだけ多くのスレッドを使用したいが、8 個を超えないように .NET に伝えたかったのです。WithDegreeOfParallelism(8).

現在、両方のコアが同時に動作していますが、CPU 使用率は 54% のままです。

したがって、これはこれまでの PLINQ バージョンです。

AsParallel残念ながら、シーケンシャル モードと比較して使用してもパフォーマンス上の利点は見られません。

for eachと( AsParallelhh:mm:ss.mm):

そしてなし:

誰かこの結果を説明してくれませんか? データベースの書き込みアクセスはfor each、同様の時間の責任ですか?


推奨される読み物は次のとおりです。

0 投票する
2 に答える
5840 参照

vb.net - VB.NET 4.0 Parallel.ForEach AddressOf Multiple Values?

DelegatesからParallel.ForEachに変更しようとしています

以下は問題なく動作するようです。

しかし、Subが複数の変数を受け取る場合はどうなりますか?以下の方法を教えていただけますか?

ありがとうございました

0 投票する
2 に答える
1143 参照

c# - Parallel Linq Extensionsを使用して2つのシーケンスを結合すると、最初に最速の結果を得るにはどうすればよいでしょうか。

整数1から5を返す2つのシーケンスがあるとしましょう。

最初は1、2、3を非常に速く返しますが、4と5はそれぞれ200msかかります。

2番目は200msの遅延で1、2、および3を返しますが、4と5は高速で返されます。

これらの両方のシーケンスを結合すると、1から5までの数字が得られます。

2つの方法のどちらがどの時点で遅延があるかを保証できないため、実行の順序で解決策を保証することはできません。したがって、私の例での(人為的な)遅延を最小限に抑えるために、ユニオンを並列化したいと思います。

実際のシナリオ:いくつかのエンティティを返すキャッシュと、すべてのエンティティを返すデータソースがあります。キャッシュされた結果ができるだけ速く生成されるように、リクエストをキャッシュとデータソースの両方に内部的に並列化するメソッドからイテレータを返すことができるようにしたいと思います。

注1:これはまだCPUサイクルを浪費していることに気づきました。シーケンスが遅い要素を反復処理するのをどのように防ぐことができるのか、できるだけ速くそれらを結合する方法を尋ねているのではありません。

更新1:複数のプロデューサーを受け入れ、ContinueWhenAllを使用してBlockingCollectionのCompleteAddingを1回だけ設定するように、achitakaさんのすばらしい応答を調整しました。コメントのフォーマットがないために失われるため、ここに配置しました。それ以上のフィードバックは素晴らしいでしょう!

0 投票する
2 に答える
1919 参照

.net - TransactionScope は Parallel Extensions で動作しませんか?

私が次のことをした場合:

TransactionScope が機能しません。scope.complete にブレークポイントを設定すると、アクティブなトランザクションはなく、更新は既に完了しています。

私はそれを変更した場合:

すべてが期待どおりに機能します。並列バージョンが正しく動作しない理由を知っている人はいますか?