我不确定这里发生了什么。如果我做
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");
});
当通过新按钮的事件处理程序从该类调用时,它可以正常工作。
但是,如果我从较旧的按钮调用相同的方法,虽然按钮事件本身会触发,但它不会触发。因此,在该按钮的事件处理程序方法中创建的线程不会运行...
嗯,我猜这解决了。
答案 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);
小心所有线程在没有异常的情况下正确完成。