クロージャは、値ではなく変数を閉じます。したがって、インクリメントすると、それを参照するタスクの動作が変わる_variable
可能性があります。
ローカルコピーを作成することで、これを防ぐことができます。
while (this._variable < 100)
{
this._variable++;
int local = _variable;
var aTask = Task.Factory.StartNew(() =>
{
aList.add(local);
update(this._savePoint);
});
}
または、値を状態としてタスクに渡すことができます。
while (this._variable < 100)
{
this._variable++;
var aTask = Task.Factory.StartNew(object state =>
{
aList.add((int)state);
update(this._savePoint);
}, this._variable);
}
_variable
これらは両方とも、の値を新しい一時変数にコピーすることによって機能します。最初のケースでは、local
変数はループのスコープ内で定義されているため、反復ごとに新しい変数を取得します。2番目のケースでは、引数_variable
としてタスクに渡すときの値のコピーを作成します。state
参照型の場合_variable
、これらのソリューションは機能しません。クローンを実行する必要があります。