[このドキュメントはプレビュー版であり、後のリリースで変更されることがあります。 空白のトピックは、プレースホルダーとして挿入されています。]
スレッド ローカル変数を使用して保存してから各 For ループによって作成される個別のタスクの状態を取得するには次の使用例に示します。 スレッド ローカル データを使用して、多数の共有状態へのアクセスを同期化のオーバーヘッド回避できます。 各繰り返しで、共有リソースへの書き込み] の代わりに計算してタスクのすべてのイテレーションが完了するまで値を格納します。 共有リソースへの 1 回だけなの最終的な結果の書き込みまたは別のメソッドに引き渡してできます。
Namespace ThreadLocal
Class Test
Private Shared Sub Main()
Dim nums As Integer() = Enumerable.Range(0, 1000000).ToArray()
Dim total As Long = 0
' Use type parameter to make subtotal a long, not an int
Parallel.For(Of Long)(0, nums.Length, Function() 0, Function(j, [loop], subtotal)
subtotal += nums(j)
Return subtotal
End Function, Function(x) Interlocked.Add(total, x))
Console.WriteLine("The total is {0}", total)
Console.WriteLine("Press any key to exit")
Console.ReadKey()
End Sub
End Class
End Namespace
namespace ThreadLocal
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
class Test
{
static void Main()
{
int[] nums = Enumerable.Range(0, 1000000).ToArray();
long total = 0;
// Use type parameter to make subtotal a long, not an int
Parallel.For<long>(0, nums.Length, () => 0, (j, loop, subtotal) =>
{
subtotal += nums[j];
return subtotal;
},
(x) => Interlocked.Add(ref total, x)
);
Console.WriteLine("The total is {0}", total);
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
}
For メソッドのそれぞれの最初の 2 つパラメーターは、開始と終了のイテレーションの値を指定します。 このオーバーロード メソッドのでは、[第 3 パラメーターが、ローカルの状態を初期化します。" ローカルの状態"このコンテキストでは、変数の有効期間は、最後のイテレーション後だけに現在のスレッドで、ループの最初の反復処理の直前にから拡張を意味します。
3 番目のパラメーターの型は Func です ` Func<(Of <(TResult>)>) TResult スレッド ローカル状態を格納する変数の型が入ります。 この例で、メソッドのジェネリック バージョンが使用され型パラメーターは の長い。 型パラメーターはスレッド ローカル状態を格納する使用される一時変数の型に、コンパイラに指示します。 () => 0 ( Function() 0 ) 式この例では、スレッド ローカル変数 0 に初期化されていることを意味します。 型パラメーターは、参照型またはユーザー定義の値の型が場合、しこの Func よいます。
//C#
() => new MyClass()
' Visual Basic
Function() new MyClass()
4 番目の種類パラメーターがループ ロジックを定義する場所です。 Intellisense、Func<int, ParallelLoopState, long> Func(Of Integer, ParallelLoopState, Long) の型が設定されていることを示しています。 ラムダ式はこれらの型に対応する同じ順序で 3 つの入力パラメーターを受け取る。 最後の型パラメーターが戻り値の型です。 ここでお parallel.For 型パラメーターで指定された型はため、型は長です。 、ラムダ式でその変数 subtotal を呼び出すし、それを返します。 戻り値は、以降各イテレーションでの小計を初期化する使用します。 またこの最後のパラメーターの最後のイテレーションが完了したときに、毎回、次に、localFinally デリゲートに渡される値としてだけと考えることができます。
第 4 パラメーターが呼び出される、このスレッドでのすべてのイテレーションが完了したらメソッドを定義する場所です。 入力パラメーターの型をもう一度、For メソッドと、本文のラムダ式によって返される型の型パラメーターに対応しています。 この例で、値がスレッドでクラス スコープで変数に追加されます安全な方法です。 スレッド ローカル変数を使用すると、私たち各イテレーションのすべてのスレッド上でこのクラスの変数への書き込みを回避しました。
ラムダ式を使用する方法については、デリゲートと PLINQ と、タスクの並列ライブラリ内のラムダ式 を参照してください。
概念