Вот программа, которую я написал для тестирования базового сценария потоковой передачи. Он работает точно так, как ожидалось, когда я запускаю его с включенной отладкой.C#/VS2013 - Почему этот код выходит из строя без отладки?
using System;
using System.Threading;
class Program
{
static bool keepCounting;
static void Main(string[] args)
{
Thread myThread = new Thread(countNumbers);
myThread.Name = "MyThread";
keepCounting = true;
myThread.Start();
Thread.Sleep(new TimeSpan(0, 0, 1)); // countNumbers() runs for 1 sec.
keepCounting = false;
}
static void countNumbers()
{
Console.WriteLine("{0} beginning count.", Thread.CurrentThread.Name);
long n = 0;
while (keepCounting)
{
n++;
}
Console.WriteLine("Current thread: {0}", Thread.CurrentThread.Name);
Console.WriteLine("Number of iterations: {0}", n);
}
}
Однако, когда я установил VS, чтобы сделать сборку выпуска, и запустить его с помощью «Start Without Debugging» - обратите внимание, что оба этих шага должны быть приняты, или же он все равно будет иметь успех - это загадочно «застревает» где-то посредине метода countNumbers()
после печати «Начало начала MyThread», и он никогда не истекает и печатает результат в окне консоли.
Может ли кто-нибудь объяснить эту глупость?
Это может применяться: http://msdn.microsoft.com/en-us/library/x13ttww7.aspx –
В частности, вам может потребоваться отметить 'keepCounting' как' volatile'. –
@MichaelPetch, да. Вот и все. – dgmulf