次のコードの何が問題になっているのか教えてもらえますか?理想的には、最初にスレッドを開始してから、設定されたイベントを待つ必要があります。その代わりに、スレッドを開始せず、WaitOne()でスタックします。
スレッドに何が起こったのか、そしてその理由を知りたいのですが。
class Program
{
static void Main(string[] args)
{
Testing t = Testing.Instance;
Console.Read();
}
}
class Testing
{
private static AutoResetEvent evt = new AutoResetEvent(false);
public static Testing Instance = new Testing();
private Testing()
{
Create();
evt.WaitOne();
Console.WriteLine("out");
}
private void Create()
{
Console.WriteLine("Starting thread");
new Thread(Print).Start();
}
private void Print()
{
Console.WriteLine("started");
evt.Set();
}
}
編集: これまでのところ、@BrokenGlassによって提供された説明は理にかなっています。ただし、コードを次のコードに変更すると、別のスレッドがコンストラクターを完了せずにインスタンスメソッドにアクセスできるようになります(@NicoSchertlerによる提案)。
private static Testing _Instance;
public static Testing Instance
{
get
{
if (_Instance == null)
_Instance = new Testing();
return _Instance;
}
}