Task.Start/Wait和Async/Await之间有什么区别?

30 浏览
0 Comments

Task.Start/Wait和Async/Await之间有什么区别?

我可能有所遗漏,但是以下两种方式之间有什么区别:\n

public void MyMethod()
{
  Task t = Task.Factory.StartNew(DoSomethingThatTakesTime);
  t.Wait();
  UpdateLabelToSayItsComplete();
}
public async void MyMethod()
{
  var result = Task.Factory.StartNew(DoSomethingThatTakesTime);
  await result;
  UpdateLabelToSayItsComplete();
}
private void DoSomethingThatTakesTime()
{
  Thread.Sleep(10000);
}

0
0 Comments

在这个例子中,通过使用async/await关键字,调用的线程不会被阻塞,而是继续执行其他操作。相反,使用Task.Start/Wait方法会阻塞调用的线程,直到任务完成。

在DoAsTask方法中,使用Task.Factory.StartNew方法创建了一个新的任务,并在后台线程中执行DoSomethingThatTakesTime方法。调用线程在调用t.Wait()方法时被阻塞,直到任务完成并返回结果。然后,调用线程继续执行其他操作。

而在DoAsAsync方法中,也是使用Task.Factory.StartNew方法创建了一个新的任务,并在后台线程中执行DoSomethingThatTakesTime方法。但是,在调用await关键字时,调用线程不会被阻塞,而是继续执行后续的操作。当任务完成并返回结果时,调用线程再次被唤醒,继续执行后续操作。

在输出结果中可以看到,使用DoAsTask方法时,"Program End"在"A - Started something"之后执行。这是因为Task.Factory.StartNew方法会在新的线程中执行任务,所以无法确定哪个操作会先执行。

使用await关键字时,输出结果中的顺序是不确定的。这是因为调用线程和后台线程是并行执行的,所以各个操作的执行顺序是不确定的。

通过使用async/await关键字,可以使异步代码更易于理解和编写,提高代码的可读性和可维护性。

至于在使用new Task(DoAsTask).Start()时,与使用DoAsAsync()方法相比,功能是相同的。不同之处在于代码的可读性和易用性。async/await关键字可以使异步代码更加直观和易于理解,而不需要额外的方法或lambda表达式来处理任务的结果。

,async/await关键字是一种语法增强,可以使异步代码更易于理解和编写。它可以防止调用线程被阻塞,同时提高代码的可读性和可维护性。虽然使用Task.Start/Wait方法也可以实现类似的功能,但不如async/await关键字简洁和直观。

0
0 Comments

在上面的代码中,有两个按钮点击事件的处理方法,分别是ButtonClick和Button_2_Click。其中,ButtonClick方法使用了Task.Start/Wait的方式,而ButtonClick方法使用了Async/Await的方式。

在ButtonClick方法中,首先创建了一个Task对象t,然后调用了t.Wait()方法,这会导致主线程被阻塞,直到t任务完成。在这个方法中,如果按下Button2按钮,控制台上不会有任何输出,直到t任务完成后,标签才会被更新。

而在Button_2_Click方法中,只是简单地输出了一行文字,没有其他操作。

DoSomethingThatTakesTime方法是一个耗时的操作,通过Thread.Sleep(10000)模拟了一个需要花费10秒钟的任务。

根据代码的注释,点击Button2按钮时,如果使用Task.Start/Wait的方式,控制台上不会有任何输出,直到任务完成后,标签才会被更新。而如果使用Async/Await的方式,点击Button2按钮后,控制台上会有输出,并且当长时间任务返回后,标签会被更新。

根据上面的代码和注释,可以看出Task.Start/Wait和Async/Await之间的主要区别是,Task.Start/Wait会阻塞主线程,直到任务完成,而Async/Await会让主线程继续执行其他操作,并在任务完成后恢复执行。

解决这个问题的方法是使用Async/Await的方式,这样可以避免阻塞主线程,提高程序的响应性。

0
0 Comments

什么是Task.Start/Wait和Async/Await之间的区别?

这个问题的出现是因为有人想知道Task.Start/Wait和Async/Await之间的区别。在提问中,有人问道Task.Wait和await task有什么区别。接下来的对话解释了这两者之间的区别。Task.Wait会阻塞线程,直到任务完成,而await会继续处理消息队列,任务完成后会返回到之前的位置。对话还解释了为什么Task.Wait不是协作阻塞,以及await不会创建新线程的原因。

对话中还讨论了Task.Wait的使用情况,以及使用Task.Run和Wait是否有区别。对话中提到,Task.Wait几乎不会被使用,除非你确实需要阻塞直到任务完成,并且知道这样做不会导致死锁。使用Task.Run和Wait时,Task.Run会在一个新线程中运行指定的操作,因此是异步的。对话还解释了async和await的作用,以及如果不想等待结果而继续执行的情况下,是否需要创建新线程。

对话中还讨论了async和await的机制,以及其如何通过消息队列来执行任务。对话中还解释了async和await对于IO密集型任务和CPU密集型任务的应用场景。对话指出,async和await可以通过将任务拆分成多个部分并以并行的方式运行来提高CPU密集型任务的性能。此外,对话还提到,通过在任务中插入任务让线程在每10毫秒左右暂停,可以保持线程对用户输入的响应性。

对话解释了Task.Start/Wait和Async/Await之间的区别,以及它们在处理任务时的不同方式。同时还解释了async和await的机制,以及它们在不同类型的任务中的应用场景。

0