2016-12-10 11 views
1

誰にでも良い日です。 今日、私は1つのことを気にして学校のプロジェクトを作りました。C#スレッド渡し整数引数が不正な数値を返す

私の問題は、Thread関数に引数を渡していることです.Console.WriteLine経由でコンソールに出力すると、不正な番号が表示されます。

static void motorkar(int id) 
    { 
     Console.WriteLine("motorkar {0}", id); 
     ... 

それは、順序の問題ではありませんが、私は、たとえば渡すとき0デバッグ中にVisual Studioが番号をコンソールに書き込みます:私は同じサイクルでそれらを開始

for (i = 0; i < 10; i++) autari[i] = new Thread(() => autar(i)); 
for (i = 0; i < 10; i++) motorkari[i] = new Thread(() => motorkar(i + 10)); 

、その機能は、これを行います2を使用し、デバッグなしでは1を書き込みます。

何が問題になりますか?私は文字列名を設定することでこれを解決できることを知っていますが、これと混同しています。

+3

問題が発生している[mcve]を投稿してください。それまでは、私の終わりからの推測では、同じ数のN個のスレッドを起動しているという問題があることになります。なぜなら、スレッドが起動するたびに 'i'変数の現在の値を使用し、同じ' i'変数* value *が存在するときにいくつかのスレッドが起動すると、共有変数を取得しているからです。すべて同じ値を使用します。 –

+0

@ LasseV.Karlsenお返事ありがとうございます。私は今問題を理解している。次回は、より明確に、最小限にするようもっと努力していきたいと思います。本当に感謝しています。 – lagugula

答えて

4

これは、コンパイラがフードの下にクロージャを作成するためです。コードを以下に変更すると、期待される出力が得られるはずです

for (i = 0; i < 10; i++) 
{ 
    var local = i; 
    autari[i] = new Thread(() => autar(local)) 
} 

for (i = 0; i < 10; i++) 
{ 
    var local = i + 10; 
    motorkari[i] = new Thread(() => motorkar(local)) 
} 
+0

私は今理解しています。どうもありがとうございました。それは素晴らしい作品です。 – lagugula

関連する問題