私は、コードのこの部分を実行したとき.Net 4.0と.Net 4.5のタスクを使用していますか?
private void button1_Click(object sender, EventArgs e)
{
Start(sender, e);
}
private void Start(object sender, EventArgs e)
{
for (int i = 0; i < 5; i++)
{
System.Threading.Tasks.Task.Factory.StartNew(() => dosomething(i));
Debug.WriteLine("Called " + i);
}
Debug.WriteLine("Finished");
}
public void dosomething(int i)
{
Debug.WriteLine("Enters " + i);
lock (this)
{
Debug.WriteLine("Working " + i);
Thread.Sleep(100);
}
Debug.WriteLine("Done " + i);
}
出力は.NETバージョン4.0と4.5と異なっています。 4.0の番号5を繰り返すと、いくつかのタスクが実行される前にiの理由の値が5に移動されたが、同じコードが4.5で異なる理由がわかります。
(出力は.NET 4.0 VS 2010で走っ)
Called 0
Called 1
Enters 1
Working 1
Called 2
Called 3
Called 4
Finished
Enters 0
Done 1
Enters 5
Working 0
Working 5
Done 0
**Enters 5
Working 5
Done 5
Enters 5
Done 5
Working 5
Done 5**
が、私は結果は、
されている.NET 4.5(VS 2011ベータ版)を実行したときに(出力は、VS 2011ベータ版で走りました。 Net 4.5)
Enters 0
Working 0
Called 0
Called 1
Enters 2
Called 2
Enters 2
Enters 3
Called 3
Called 4
Finished
Done 0
Working 2
Enters 5
Done 2
Working 3
Done 3
Working 5
Done 5
Working 2
Done 2
CLR 4.5のタスクで行われた変更を確認できませんでしたか?誰でも私に、.Net 4.5の変更点を教えてください。
私は注文について気にしませんが、私は値が.Net 4.0ではスレッド間で共有されていますが、.Net 4.5では共有されないことを見ています。 – murali
'Start()'の 'i'変数はどちらの場合でも共有されます。正確に何が起こるかは操作の順序に依存します。 – svick
あなたのお時間をありがとう...だから、あなたのポイントは、4.5と変更されていない、結果は操作の順序が異なるためですか?私はそうは思わない、何故これを言っているのか?出力を伴うアクションの順序を観察すると、一時停止後にのみ値が影響を受けます。私は何度も何度もテストしましたが、順序は異なりますが、結果は上記と同じです... – murali