2016-11-29 1 views
0

У меня возникла проблема сегодня, я не могу объяснить. У меня есть задача, которая вызывает метод, но целочисленный параметр, похоже, не обрабатывается как тип значения.Неожиданное поведение с Task и integer в .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(); 
      } 
     } 
    } 
} 

The (я == 3) в Start() никогда не проверяет истинно, (индекс == 3) в DoWork() всегда верно. Как это возможно?

+3

Вы хотите знать, почему ваш 'if (i == 3)' не попадает? Это связано с тем, что ваши циклы for начинаются с нуля. Измените его на 'for (int i = 1; i RandomStranger

+0

Не поможет - вы также должны изменить условие от '<' до '<='. –

+0

@ Джеймс, да, это странная вещь. Я бы не ожидал, что это может произойти. – FrankyHollywood

ответ

4

Это происходит потому, что вы принимаете переменную i здесь Task.Run(() => DoWork(i));, но Task не запускается немедленно, а цикл FOR может изменить i до запуска этой задачи. Вот почему вы можете справиться с внутренней задачей 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 
} 

Для получения дополнительной информации пожалуйста смотрите здесь Captured variable in a loop in C#

И ofcource я advicing прочитать эту статью http://csharpindepth.com/Articles/Chapter5/Closures.aspx

+0

Этот ответ нуждается в дополнительном описании или набросках фактический вопрос. Это в основном копия папок кода OP. – ColinM

+2

@ColinM Я попытался объяснить код OP, поэтому мне пришлось его скопировать. – tym32167

-2

«я» никогда не может быть равен 3 в вашем коде. Вы не можете увеличить не из нитей 4

int numberThreads = 4; 

ИЛИ

изменения вашего для петли синтаксиса принимать 3 темы.

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

Вариант 2 имеет более логичный смысл в вашем случае.

+0

Хотя это ударит по первой точке останова, оно не отвечает на заданный вопрос. –

Смежные вопросы