Console.ReadKey()
マルチスレッド プログラムで使用すると、奇妙な問題が発生します。
私の質問は次のとおりです。なぜこれが起こっているのですか?それはバグですか、それとも私が悪用しているためConsole
ですか? (ドキュメントによると、コンソールはスレッドセーフであると想定されていることに注意してください。)
これをコードで説明するのが最も簡単です。
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
internal class Program
{
private static void Main(string[] args)
{
Console.WriteLine("X"); // Also try with this line commented out.
Task.Factory.StartNew(test);
Console.ReadKey();
}
private static void test()
{
Console.WriteLine("Entering the test() function.");
Thread.Sleep(1000);
Console.WriteLine("Exiting the test() function.");
}
}
}
キーを押さずに実行すると、何が表示されると思いますか?
答えはまさにあなたが期待するものです:
X
Entering the test() function.
Exiting the test() function.
をコメントアウトして、Console.WriteLine("X")
もう一度実行します (キーを押さずに)。この出力が表示されることを期待していました:
Entering the test() function.
Exiting the test() function.
代わりに、何も見えません。次に、キーを押すと、次のように表示されます。
Entering the test() function.
...以上です。プログラムは (もちろん) 終了し、次の に進む時間がありませんWriteLine()
。
この行動はとても神秘的だと思います。回避するのは簡単ですが、なぜそれが起こるのか興味があります。
[編集]
Thread.Sleep(1)
直前に追加するとConsole.ReadKey()
、期待どおりに機能します。もちろん、Console.ReadKey()
とにかく永遠に待機する必要があるため、これは必要ありません。
ある種の競合状態のように見えますか?
詳細情報: Servy は、Console.WriteLine("Entering the test() function.")
いずれかのキーが押されるまで回線がブロックされていることを発見しました (私も複製しました)。
ビルド構成
Visual Studio 2012、Windows 7 x64、クアッド コア、英語 (英国)。
.Net4、.Net4.5、x86、AnyCPU、およびデバッグとリリースのすべての組み合わせを試しましたが、どれも私の PC では機能しません。しかし、本当に奇妙なことが起こりました。.Net4 用の AnyCPU バージョンを最初に試したときに動作し始めましたが、再び動作しなくなりました。一部のシステムにのみ影響する競合状態に非常によく似ています。