問題タブ [parallel.foreach]

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 投票する
1 に答える
1157 参照

asp.net - WCF サービスで値を返した後に処理を続行する方法

私は、他のいくつかの Web サービスを順番に呼び出している WCF サービスを持っています。サービスは優先順に並べられますが、並行して呼び出されます。各サービスは true または false で応答し、すべての応答が受信されると、最も好ましい陽性がクライアントに返されます。

ただし、この間の任意の時点で、最も優先されるサービスが肯定的に応答する可能性があります。この時点で他のサービスのクエリを続行しても意味がないため、実行をキャンセルしてクライアントに結果を返したいと考えています。

私にできることはそれだけです:

上記のコードは私のコードの非常に単純化されたバージョンですが、基本的には各応答をチェックして、現在最も優先されるサービスであるかどうかを確認します。その場合、ループをキャンセルします。

ただし...この方法でループをキャンセルすると、ループを終了する前に、既に呼び出されたサービスが終了するのを待ちます。いずれかのサービスがタイムアウトになる可能性は十分にありますが、もちろんこれは否定的なものとして扱われます。そのうちの 1 つでもタイムアウトになると、応答時間が 10 秒長くなります。

私がやりたいことは、次のいずれかです。

  1. 優先サービスをクライアントに返し、すでに開始されているサービスからの応答の処理を続行します (これは、これらのサービスの正/負の割合を知るための純粋なログ記録のためです)。
  2. ループを即座にキャンセルし、残りの応答を忘れます。理想的には、これを行いたくありません。これは、肯定的に応答したサービスがそのように記録されず、好みの評価に影響することを意味するためです。

だから私の質問はこれです:

私が達成したいことは可能ですか?私は、parallel.foreach がこの仕事に最適なツールではないかもしれないこと、またはクライアントに応答した後に応答をログに記録できないかもしれないことを認識しています。最も重要な要件は、「勝者」がすでに選択されている場合に、サービスが応答するのを待たずに、クライアントが迅速な応答を受信することです。

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

c# - Parallel.ForEachの使用を防止または禁止する

その上にライブラリをSystem.Data.SQLite作成し、それ(私のライブラリ)がを使用すると予測できない動作をすることに気づきましたParallel.ForEach。私はこれを最終的にデバッグする可能性があります(つまり、時間がかかる場合)、おそらく適切な部分をロックすることによってですが、今のところ、ライブラリの使用を禁止するParallel.ForEachか、ライブラリの使用を強制して許可(または結果)したいとします単一のスレッドのみ、どのように進めますか?

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

c# - Parallel.ForEach 最後にスレッドがありません

多くのプロジェクト/ファイルをコンパイルする必要があるアプリケーションをテストしています。

Parallel で処理する必要がある ConucrrentBag があります。

並列の私の呼び出しはこれです:

MaxProcess の量は LogicalCpu*2 です。

140 個のプロジェクトをコンパイルしているとき、Parallel は最後まで線形の少ないスレッドを開始します。少なくとも、最後の 4 つのプロジェクトで実行されているスレッドは 1 つだけです。それは良くありませんが、大丈夫です。

今私の問題:

約 14000 以上のプロジェクト (COBOL-SOURCE です ;-) と非常に大きなシステムをコンパイルしているとき) Parallel.ForEach が新しいスレッドを開始していないため、最後のモジュールはコンパイルされません。この時点で有効なワーキングスレッドはありません。しかし、concurrentBag にはまだ 140 個の項目があります。

これを解決する方法を知っている人はいますか?

編集:その問題は、コンパイラを実行したときにのみ発生します。コンパイラを実行せずに(テストを高速化するため)正常に動作します...

編集:

Parallel.ForEach プロセスを開始すると、ConcurrentBag はすでに完全に満たされています。

詳細については、SingleProcess のコード:

CobolCompiler クラスの Codesnippet は次のとおりです。

public void Compile(文字列ファイル) {

コンパイルプロセスごとに2秒間スリープしてみました。しかし、これは何も変わりません。

コンパイルの進行中、CPU は 100% です。アプリケーションは 270 MB の RAM を収集しています。開始時はわずか 35MB です。

コンパイラは同じ作業ディレクトリで同時に複数のファイルをコンパイルできないため、すべてのソースを一時フォルダーにコピーする必要があります。

編集: スレッドがなくてもアイテムがあるという問題は既に修正しました。

ProcessSingle では、dll にリンクされていないときに、もう一度コンパイルしようとしたアイテムを追加します。

そのため、Parallel.ForEach の処理中に、14000 個のアイテムから始めて、(リンクに失敗した場合は) アイテムをこの concurrentBag に再度追加しました。したがって、ForEach の 14000 回の実行で終了し、再度コンパイルする必要がある xxx モジュールがあります。:-(

私はそれを見ませんでした。WaitForExit なしで prReschk を実行することが意図されています。14000 を超えるアイテムのリソースをチェックするため、長い時間がかかりますが、新しいコンパイルを妨げるべきではありません。

しかし、ConcurrentBag の最後にスレッドが少ないという問題はまだ存在します :( しかし、それは大量のサイクルの場合にのみ通知されます。

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

c# - Parallel.ForEachの使用中のSystem.AggregateExeption

より良いオプションがないため、検索からスチームプロファイルIDを収集するためにこのWebクローラーを構築しています。

サービスとして実行することになっていますが、動作させることができません。コードをコピーしてコンソールアプリケーションとして実行すると、完全に機能します。

私はWindowsサービスプログラミングと並列タスクの使用に慣れていないので、他に完全にオフまたは非効率的なものがある場合は、私に教えてください。しかし、目前の問題はより重要です。

私はeventviewerを使用してデバッグしようとしましたが、それも初めてで、非常に面倒で、何を探すべきかわからないことがわかりました。

以下は、コンソールアプリケーションで機能するが、Windowsサービスとしては機能しないコードです。なぜコンソールアプリケーションでのみ機能するのですか?

eventviwerからのスタック。ソースは.NETランタイムとしてリストされています

アプリケーション:SSIDGatherer.exeフレームワークバージョン:v4.0.30319説明:未処理の例外が原因でプロセスが終了しました。例外情報:System.AggregateExceptionスタック:System.Threading.Tasks.Parallel.ForWorker [[System._ Canon、mscorlib、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]](Int32、Int32、System.Threading .Tasks.ParallelOptions、System.Action 1<Int32>, System.Action2、System.Func 4<Int32,System.Threading.Tasks.ParallelLoopState,System.__Canon,System.__Canon>, System.Func1、System.Action 1<System.__Canon>) at System.Threading.Tasks.Parallel.ForEachWorker[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](System.__Canon[], System.Threading.Tasks.ParallelOptions, System.Action1、System.Action 2<System.__Canon,System.Threading.Tasks.ParallelLoopState>, System.Action3、System.Func 4<System.__Canon,System.Threading.Tasks.ParallelLoopState,System.__Canon,System.__Canon>, System.Func5、System.Func 1<System.__Canon>, System.Action1)atSystem.Threading.Tasks.Parallel.ForEachWorker[[System。_Canon、mscorlib、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]、[System._Canon、mscorlib、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]](System.Collections.Generic.IEnumerable 1<System.__Canon>, System.Threading.Tasks.ParallelOptions, System.Action1、System.Action 2<System.__Canon,System.Threading.Tasks.ParallelLoopState>, System.Action3、System.Func 4<System.__Canon,System.Threading.Tasks.ParallelLoopState,System.__Canon,System.__Canon>, System.Func5、System.Func 1<System.__Canon>, System.Action1)at System.Threading.Tasks .Parallel.ForEach[[System。_Canon、mscorlib、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]](System.Collections.Generic.IEnumerable1<System.__Canon>, System.Action1)SSIDGatherer.SSIDGatherer.Treading()at System.Threading.ThreadHelper.ThreadStart_Context(System.Object)at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext、System.Threading.ContextCallback、System.Object、Boolean) System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext、System.Threading.ContextCallback、System.Object)でSystem.Threading.ThreadHelper.ThreadStart()で

0 投票する
4 に答える
25428 参照

c# - Parallel.Invoke と Parallel.ForEach は本質的に同じものですか?

そして、「同じこと」とは、これら 2 つの操作が基本的に同じ作業を行うことを意味します。つまり、作業する必要があるものに基づいて、どちらを呼び出すのがより便利であるかということです。(つまり、デリゲートのリストまたは反復するもののリスト)? MSDN、StackOverflow、およびさまざまなランダムな記事を検索してきましたが、これに対する明確な答えをまだ見つけていません。

編集: もっと明確にすべきでした。2 つの方法が同じことを行うかどうかを尋ねているのは、そうでない場合、どちらがより効率的かを理解したいからです。

例: 500 個のキー値のリストがあります。現在foreach、リストを (シリアルに) 反復処理し、各項目に対して作業を実行するループを使用しています。複数のコアを利用したい場合は、Parallel.ForEach代わりに単純に使用する必要がありますか?
議論のために、これらの 500 のタスクに対して 500 のデリゲートの配列があるとしましょう。500 のデリゲートParallel.Invokeのリストを呼び出して与えることで、最終的な効果は異なるでしょうか?

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

c# - WebClient 使用時の Parallel.ForEach エラー

まず、私の免責事項:私は並行初心者です。これは簡単に「恥ずかしいほど並列」の問題に取り組むことができると思っていましたが、ループに陥ってしまいました。

ウェブからいくつかの写真を並行してダウンロードしようとしています。元の写真は高解像度でかなりの容量を占めるので、ダウンロードしたら圧縮します。

コードは次のとおりです。

ここで私は混乱します。各写真は、webClient.DownloadFile行の SavePhotoFile() メソッドの Catch{} ブロックにヒットします。エラー メッセージは、WebClient 要求中に発生した例外であり、内部の詳細は「別のプロセスによって使用されているため、プロセスはファイル . . . -original.jpg にアクセスできません。」です。

このエラーで十分に混乱していなかったとしたら、次に何が起こるかでさらに混乱します。メッセージを無視して待つと、最終的に画像がダウンロードされて処理されることがわかりました。

どうしたの?

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

c# - Parallel.ForEachデバッグまたはステップスルー

parallel.foreachをステップスルーする簡単な方法はありますか?ブレークポイントを使用してこれをデバッグするための最良の方法は何ですか?

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

c# - ListView を使用した Parallel.ForEach

次のコードがあります。

次のコンパイルエラーが発生します。

メソッド 'System.Threading.Tasks.Parallel.ForEach(System.Collections.Concurrent.OrderablePartitioner, System.Threading.Tasks.ParallelOptions, System.Action)' の型引数は、使用法から推測できません。型引数を明示的に指定してみてください。

タスクでリストビューを使用する方法を検索しましたが、何も見つかりませんでした。

ListView で Parallel.ForEach を使用するにはどうすればよいですか?

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

c# - リクエストの速度

ループごとに2つの並列を介してWebリクエストを送信するコードがあります。このメソッドが発生する前にスレッドを追加すると、これらのタスクの実行に遅延が発生しますか、それともより多くのWeb要求を達成しますか?

//..。

//.。

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

.net - 現在の Parallel.ForEach をキャンセルして新たに開始する方法

機能的には、ListView にバインドされた単語の長いリストがあります。文字の TextBox を使用して、単語のリストをフィルタリングします。

新しい文字では、処理中のバックグラウンド フィルターをキャンセルする必要があります。次に、1 秒 (DispatcherTimer) 待機して、新しいバックグラウンド並列フィルターを開始します。

BackGroundWorker を使用してこれを機能させますが、cancel-any-processing 部分を Parallel に変換することはできません。基本的に「if (backgroundWorkerFTSfilter.IsBusy) backgroundWorkerFTSfilter.CancelAsync();」が必要です。並行して。
私がこれについて間違っている場合は、私に知らせてください。

アーマンからの答えは私をこれに導きました

回答に非常に感謝しており、これを実行時間の長いタスクやリストの長いリストに使用しますが、パフォーマンスが非常に優れているため、これを get に移動しました (まだ 1 秒の遅延があります)。メモリ フットプリントが小さくなります。800,000 に対して 1/10 秒未満で実行されます。