2016-11-29 15 views
0

今日は問題が発生しましたが説明できません。メソッドを呼び出すタスクがありますが、整数パラメータは値型のように扱われないようです。私は、簡単な設定でそれを再現することができタスクと.NETの整数で予期しない動作が発生する

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Start(); 
     } 

     private static void Start() 
     { 
      int numberThreads = 3; 

      for (int i = 0; i < numberThreads; i++) 
      { 
       if (i == 3) 
       { 
        // Never gets hit 
        System.Diagnostics.Debugger.Break(); 
       } 
       Task.Run(() => DoWork(i)); 
      } 
     } 

     private static void DoWork(int index) 
     { 
      if (index == 3) 
      { 
       // index = 3 
       System.Diagnostics.Debugger.Break(); 
      } 
     } 
    } 
} 

(I == 3)スタートに()がtrueを検証することはありません、DoWork中(インデックス== 3)は、()は常に真です。 これはどのように可能ですか?

+3

'if(i == 3)'がヒットしない理由を知りたいですか?あなたのforループは0から始まるからです。これを 'for(int i = 1; i RandomStranger

+0

助けにならないでしょう - 条件を '<'から '<='に変えなければなりません。 –

+0

@ジェームズ、はい、それは奇妙なことです。 – FrankyHollywood

答えて

4

ここでは変数iを取ってTask.Run(() => DoWork(i));だからこそ起こりますが、タスクはすぐに開始せず、FORループはそのタスクが実行される前に変更することができます。それでなぜあなたはタスク内でi == 3を処理できるのですか?

for (int i = 0; i < numberThreads; i++) 
{ 
    if (i == 3) 
    { 
     // Never gets hit 
     System.Diagnostics.Debugger.Break(); 
    } 
    Task.Run(() => DoWork(i)); <= action will executed after we exited from for loop 
} 

詳細についてはplsはここCaptured variable in a loop in C#

を参照してくださいそして、私はこの記事http://csharpindepth.com/Articles/Chapter5/Closures.aspx

+0

この回答は、詳細な説明または実際の問題それは基本的にOPコードのコピー貼りです。 – ColinM

+2

@ColinM私はOPコードを説明しようとしたので、私はそれをコピーしなければならなかった。 – tym32167

-2

を読むためにadvicing ofcource "i" は、あなたのコード内で3に等しくなることはありません。あなたは3つのスレッドを受け入れるように4

int numberThreads = 4; 

OR

変化にあなたのforループ構文をスレッドのないを増やすことはできませんどちらか。

int numberThreads = 3; 
for (int i = 0; i <= numberThreads; i++) 

オプション2は、あなたのケースではより理にかなっています。

+0

これは最初のブレークポイントに当たるが、実際の質問には答えられない。 –

関連する問題