2017-07-29 6 views
-1

ここで何が起こっているのか分かりません。私は待たずにスレッドが実行されない

Task.Run(() => 
     { 
      System.Windows.MessageBox.Show("abc"); 
      Thread.Sleep(5000); 
     }).Wait(); 

を行う場合、これは通常、実行され、プログラムは罰金などを動作しますが、私がしなければ

Task.Run(() => 
     { 
      System.Windows.MessageBox.Show("abc"); 
      Thread.Sleep(5000); 
     }); 

何も起こりません!

2番目のケースでは、スレッドだけが起動しません。私はビジュアルスタジオを使用して、私は最後に非同期メソッドで仕事をしてから、インテリジェンスがクラッシュしたりしていました。それ以来、私はそれを待たなければ、私のアプリで新しいスレッドを開始することはできません、それは目的を破る。

私は別のプロジェクトの最初のケースのようにスレッドを開始しようとするとうまくいきます。

誰もが何が間違っているのでしょうか?

を編集します。OKフォームに新しいボタンを作成し、クリックイベントを追加しました。私はこのコードを別のクラスの新しいメソッドに入れます:

Task.Run(() => 
     { 
      MessageBox.Show("abc"); 
     }); 

新しいボタンのイベントハンドラでそのクラスから呼び出されたときはうまくいきます。

しかし、以前のボタンからこの同じメソッドを呼び出すと、ボタンイベント自体が起動しても起動しません。したがって、そのボタンのイベントハンドラメソッドで作成されたスレッドは実行されません...

まあ、私はそれを解決すると思います。

+4

これは信じがたいことです。タスクが実際に開始される前にアプリが終了しているだけではないと確信していますか?問題を示す[mcve]を入力してください。 –

+0

ビジュアルスタジオがクラッシュしたとき、ボタンのプロパティウィンドウで設定したボタンのクリックイベントが正しく設定されていませんでした。再起動すると、コードはボタンに留まったままになりました。 'button.Click + =新しいEventHandler(button_Click);'はしませんでした。数回私に起こった。 –

答えて

-1

あなたは、複数のスレッドを開始し、このような終わりに待つことができます。

var thread1 = Task.Run(() => 
    { 
     System.Windows.MessageBox.Show("abc"); 
     Thread.Sleep(5000); 
    }); 
var thread2 = Task.Run(() => 
    { 
     System.Windows.MessageBox.Show("def"); 
     Thread.Sleep(5000); 
    }); 
Task.WaitAll(thread1, thread2); 

例外なく正常にすべてのスレッド仕上げているように注意してください。

+0

これは質問された質問にどのように関連しているのかわかりません... –

0

Task.Runを使用すると、thereadプール内で実行される新しいthereadを作成するようなものです。スレッドがバックグラウンドで実行されることを意味します。 タスククラスからの待機コマンドを使用したように、メインスレッドをブロックする必要があります。

関連する問題