除非等待,否则线程不会运行

时间:2017-07-29 18:13:42

标签: c# .net visual-studio

我不确定这里发生了什么。如果我做

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

这将正常执行并且程序正常工作等。但是如果我这样做

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

什么都没发生!

在第二种情况下,线程无法启动。我使用视觉工作室,我做的最后一件事是在异步方法上工作,然后智能崩溃或其他东西。从那时起,我无法在我的应用程序中启动新的线程,除非我等待它,这违背了目的。

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

任何人都有错误的想法?

修改:好的,我在表单上创建了一个新按钮并添加了一个点击事件。我将此代码放在另一个类的新方法中:

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

当通过新按钮的事件处理程序从该类调用时,它可以正常工作。

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

嗯,我猜这解决了。

2 个答案:

答案 0 :(得分:0)

当你使用Task.Run就像创建一个将在那里的池中运行的新的那个。我的意思是线程将在后台执行。 因此,您需要阻止主线程,就像使用命令wait from task class一样。

答案 1 :(得分:-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);

小心所有线程在没有异常的情况下正确完成。