.NET ThreadPoolにはa sample on MSDNがあります。このコードを実行すると、出力が完全に不安定になることがあります。コンソール上で完全に空の出力が得られることがあります。.NET、x64でConsole.WriteLineマルチスレッド出力が空です。
Thread.Sleep()
コールを追加すると、わずか数ミリ秒でも出力は正常です。
AFAIK Console.WriteLine()
はスレッドセーフなので、出力は常にそこにあるはずです。しかし、少なくとも私のi7 2600 x64
コンパイルされたバージョンではない。明らかに、ブレークポイントを追加するとすべてが問題ありませんが、それは私を怒らせます。
私はConcurrentBagを追加してものがあることを確認しましたが、その要素を印刷することさえ空です。繰り返しますが、ブレークポイントを追加するとすべてが問題ありません。
{
public class TaskInfo
{
public string m_text;
public int m_value;
public ConcurrentBag<int> m_bag;
public TaskInfo(string text, int value, ConcurrentBag<int> bag)
{
m_text = text;
m_value = value;
m_bag = bag;
}
}
class Program
{
static void Main(string[] args)
{
Program p = new Program();
p.Run();
}
void Run()
{
ConcurrentBag<int> concurrentBag = new ConcurrentBag<int>();
for (int i = 0; i < 10; i++)
{
TaskInfo ti = new TaskInfo("Hello Thread", i, concurrentBag);
bool b = ThreadPool.QueueUserWorkItem(new WaitCallback(MyThreadFunction), ti);
if (!b)
{
Console.WriteLine("Damn!");
}
//Thread.Sleep(5);
}
for (int j = 0; j < concurrentBag.Count; j++)
{
Console.WriteLine("This is in the bag: {0}", concurrentBag.ElementAt(j));
}
}
static void MyThreadFunction(object stateInfo)
{
TaskInfo ti = (TaskInfo)stateInfo;
ti.m_bag.Add(ti.m_value);
Console.WriteLine(ti.m_text + ti.m_value.ToString());
}
}
}
サンプルにリンクできますか? –
http://msdn.microsoft.com/en-us/library/kbf0f1ct(v=vs.80).aspx –