2012-03-15 8 views
3

私はLinqPadを使い始めていて、スレッドスニペットを試していましたが、なぜ私のコードが予測通りに動いていないのかがわかりました。LINQpadスレッドの動作

Thread t1 = new Thread 
(delegate() 
    { 
     for (int cycles = 0; cycles < 1000; cycles++) 
     { 
      Thread.Sleep(500); 
      Console.WriteLine("Hello World!"); 
     } 
    } 
); 
t1.Start(); 

Console.WriteLine("Soham"); 

Sohamなぜこの印刷だけですか?スレッド内のコードブロックはまったく実行されていません。私はなぜ文法がうまくコンパイルされているのか理解できませんし、C#について知っている限り、これはうまくコンパイルしてVS2010で実行し、その順序は決めることはできませんが両方の出力を実行します。私は何をしているのか、ここで間違って考えています私はLinqPadに慣れるために、いくつかの役に立つチュートリアルや提案が必要な場合があります。

+2

はい:この動作は直感的ではありません。良いニュースは、最近のベータ版で変更されたことです(linqpad.net/beta.aspx)。メインスレッドが終了した後、他のスレッドはLINQPadで継続します。 –

+0

@JoeAlbahariありがとうジョー。優れたツール。 –

答えて

7

Console.WriteLine("Soham")の後にt1.Join()を追加してみてください:-) LINQPadは、おそらくメインスレッドが終了してすべてを殺したとみなします。 t1.Join();では、メインスレッドは他のスレッドが終了するのを待ちます。

ああ...と私はあなたがより少ない文字で書くことができることを追加します

:-)それをテスト:

new Thread(() => 
{ 
+0

Joseph Albahariさんの[Threading in C#](http://www.albahari.com/threading/)のサンプルを試してみましたか?とりあえずありがとう。あなたの最初の例をチェックすると、 'Join 'を呼び出すことによって、' CLR'の振る舞いを違うものにすることはできません。 –

+0

@SohamDasguptaスケジューリングの順番、メインスレッドから終了までの時間に依存します。メインスレッドが終了するのに少なくとも数十ミリ秒かかる場合は、セカンダリスレッドが実行される可能性があります。メインスレッドの最後に 'Thread.Sleep(x)'を追加し( 't1.Join'は必要ありません)、値を変更することで試すことができます。私は2番目のスレッドで 'Console.WriteLine()'の後に 'Thread.Sleep(500)'を移動さえします。 – xanatos