私は最近、Rob Miles (ここ) からの非常に素晴らしい pdf を読みながら、Threads に取り掛かっています。彼は 160 ページ (2012 年、C# pdf) に例を示しましたが、空のループを実行しただけでコンソールに書き込みませんでした。
1000 の倍数ごとに ID を画面に書き込む 10 個のスレッドを作成する、非常に単純なスレッド生成ループを作成しました。私の質問は、なぜ私の出力がこんなに混乱しているのか? から始まります。以下のプログラムを実行すると、複数の「Thread 3 Finished」行が表示されることがよくありますが、それぞれに 1 つしかないはずです。
MSDN からループに「ロック」を追加しましたが、それでも奇妙な出力が生成されるようです (以下に例を示します)。
namespace ConsoleApplication1
{
class Program
{
static object sync = new object();
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
Thread myThread = new Thread(() => DoThis(i));
myThread.Start();
}
Console.ReadLine();
}
static void DoThis(int s)
{
lock (sync) // a new addition that hasn't helped
{
for (long j = 0; j < 10000; j++)
{
if (j % 1000 == 0) Console.Write(String.Format("{0}.", s));
}
Console.WriteLine("\r\nThread {0} Finished", s);
Debug.Print("\r\nThread {0} Finished", s); //<-- added to debug
}
}
}
}
私は大丈夫だと思った-ローカル変数(私のカウントループ)があり、おそらく参照ではなく渡されるintがあり、後でループ中にロックしようとしました。喜びはありません。出力を適切に見せるために何をする必要がありますか? トラブルシューティングのために Deubg.Print を試しましたが、エラーもあります (以下)。
最終的には、より大きなアプリケーションでスレッド化を使用したいと考えていますが、ここで使用できない場合は、使用したいかどうかわかりません。
最後の debug.print 行からの出力例: (倍数に注意してください) ...
Thread 1 Done The thread '<No Name>' (0x15cc) has exited with code 0 (0x0). Thread 9 Done The thread '<No Name>' (0x1d0c) has exited with code 0 (0x0). Thread 6 Done The thread '<No Name>' (0x2248) has exited with code 0 (0x0). Thread 10 Done The thread '<No Name>' (0x22bc) has exited with code 0 (0x0). Thread 9 Done The thread '<No Name>' (0x85c) has exited with code 0 (0x0). Thread 9 Done The thread '<No Name>' (0x1628) has exited with code 0 (0x0). Thread 3 Done The thread '<No Name>' (0x2384) has exited with code 0 (0x0). Thread 6 Done Thread 2 Done Thread 4 Done The thread '<No Name>' (0x2348) has exited with code 0 (0x0). The thread '<No Name>' (0x2420) has exited with code 0 (0x0). The thread '<No Name>' (0x1ea8) has exited with code 0 (0x0).
私が試したことについてさらに情報を提供できるかどうか教えてください。