2017-07-29 52 views
-1

我不确定这里发生了什么。如果我做线程无法运行,除非等待

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

这将正常执行和程序工作正常等,但如果我这样做

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

什么也没有发生!

在第二种情况下线程不启动。我使用visual studio,我做的最后一件事是在异步方法上工作,然后intellisence崩溃或什么。从那时起,除非我等待它,否则我无法在自己的应用程序中启动一个新线程,从而破坏了目的。

如果我尝试像在不同的项目中的第一种情况下启动线程,它工作正常。

任何人有一个想法什么是错的?

编辑:好的我在窗体上做了一个新按钮并添加了一个单击事件。我把这个代码在一个新的方法在不同的类:

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

当从一个类由新按钮的事件处理函数调用它工作正常。

但是,如果我从旧按钮调用相同的方法,它不会触发,尽管按钮事件本身触发。因此,在该按钮的事件处理程序方法中创建的线程不会运行...

那么我想解决它。

+4

我觉得这很难相信。你确定这不仅仅是你的应用程序在任务实际开始之前完成了吗?请提供证明问题的[mcve]。 –

+0

当视觉工作室崩溃时,通过按钮的“属性”窗口设置的按钮的单击事件未正确设置。当你重新启动时,代码保持不变,但按钮。 'button.Click + = new 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。我的意思是线程将在后台执行。 因此,您需要一些东西来阻止主线程,就像您使用命令等待来自任务类一样。