並列。

Linda Hamilton
リリース: 2025-02-01 03:26:09
オリジナル
522 人が閲覧しました

Can Parallel.ForEach Effectively Utilize Asynchronous Lambda Expressions?

並列性と非同期ラムダ:バランスのとれた行為

並列処理は、複数のコアにワークロードを分散することにより、パフォーマンスを大幅に向上させます。 ただし、並列ループ内に非同期のラムダ式を統合すると、ユニークな課題があります。

問題:失われたタスク この例を考えてみましょう:

<code class="language-csharp">var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
  // Pre-processing
  var response = await GetData(item);
  bag.Add(response);
  // Post-processing
});
var count = bag.Count; // count is often 0</code>
ログイン後にコピー
は、

の背景スレッドが非同期操作が完了するのを待たないため、頻繁に0のままです。 これを修正しようとする素朴な試み:count Parallel.ForEach

これによりタスクの完了が保証されますが、スレッドをブロックして手動例外処理を必要とすることにより、非同期プログラミングの利点を無効にします。
<code class="language-csharp">var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
  // Pre-processing
  var responseTask = GetData(item);
  responseTask.Wait();
  var response = responseTask.Result;
  bag.Add(response);
  // Post-processing
});
var count = bag.Count;</code>
ログイン後にコピー

効果的な解決策

このアプローチは、各アイテムのタスクを作成し、非同期実行を可能にします。 継続する前にすべてのタスクが終了するようにします。

より複雑なシナリオについては、Stephen Toubのブログ投稿

は、高度なテクニックとベストプラクティスを提供しています。 これにより、並列ループ内で非同期操作を処理するためのより堅牢で効率的なソリューションが提供されます。

以上が並列。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート