2014-01-25 3 views
3

Я абсолютно новичок в потоках и стараюсь понять самые основы. У меня этот код с асинхронными делегатами вызовом:C# асинхронные делегаты, планирование потоков

static void Main(string[] args) 
{  
    Action<Thread, string> action = (mainThread, name) => 
     { 
      Thread.CurrentThread.Name = name; 
      Thread.CurrentThread.IsBackground = false; 
      Console.WriteLine("Thread {0} starts", Thread.CurrentThread.Name); 
      while (true) 
      { 
       var input = Console.ReadLine(); 
       Console.WriteLine("Thread {0} catches an input. User's input is: \"{1}\"" 
            +"\nMain thread is alive = {2}", 
            Thread.CurrentThread.Name, input, mainThread.IsAlive); 
      } 
     }; 
    action.BeginInvoke(Thread.CurrentThread,"First", null, null); 
    action.BeginInvoke(Thread.CurrentThread, "Second", null, null); 
    Thread.Sleep(2000); 
} 

И все, что я делаю, результат вывода всегда идет в следующем порядке: первый> второго> первого> второго> Первый ...

output

насколько я понимаю, порядок вывода должен быть nondetermenistic. Бу в этом случае. Как обрабатывается очередь потоков? Что мне не хватает? Пожалуйста, объясните

+1

Если вы хотите, чтобы проверить многопоточность попытаться избежать пользовательского ввода, Я довольно-таки есть замок внутри Console.readline, который заставляет их по очереди. – OopsUser

+0

Они используют одну и ту же консоль. –

+0

Но почему один нить ни разу за один раз не делает дважды print-readline-print-readline? – user3101007

ответ

4

Когда вы ждете ввода от пользователя на var input = Console.ReadLine();, вы в основном блокируете свои потоки. первый ждет ввода и когда он его принт. Другой поток в точное время уже запрашивал ввод и ожидал его. Таким образом, вы получаете по одной строке для каждой.

Если удалить ReadLine и использовать эту линию вместо:

var input = "Hamster"; 

вы получите результаты, которые вы хотите:

enter image description here

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