以下程序是使用通用 Task.Run() 并使用 async 和 await(异步)设计的。在这两种情况下,都会从线程池中获取不同的线程来执行新任务。那么区别是什么呢?异步意味着它应该使用主线程并释放它直到任务完成。但它也在使用另一个线程而不是使用主线程。
public class Worker2
{
public bool IsComplete { get; private set; }
internal void DoWork()
{
this.IsComplete = false;
Console.WriteLine("Doing Work.");
Task.Run(new Action(LongOperation));
Console.WriteLine("Work Completed");
IsComplete = true;
}
private void LongOperation()
{
Console.WriteLine("long operation thread thread :" + Thread.CurrentThread.ManagedThreadId);//Thread Id = 7. it is different from main thread id.
Console.WriteLine("Working!");
Thread.Sleep(3000);
}
}
//异步
public class Worker2
{
public bool IsComplete { get; private set; }
internal async void DoWork()
{
this.IsComplete = false;
Console.WriteLine("Doing Work.");
await LongOperation();
Console.WriteLine("Work Completed");
IsComplete = true;
}
private Task LongOperation()
{
return Task.Run(() =>
{
Console.WriteLine("long operation thread thread :" + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("Working!");
Thread.Sleep(3000);
});
}
}
最佳答案
What is the difference between Task.Run() and await Task.Run()?
第一个开始一个任务,然后在该任务之后立即开始工作,在任务完成之前。
第二个启动一个任务,然后执行不同的工作,直到任务完成,此时它执行任务之后的工作。
我们打个比方。你的第一个程序是这样的:
- 雇人修剪草坪。
- 告诉您的配偶草坪已经修剪过了。
- 去看 Netflix。
你的第二个程序是:
- 雇人修剪草坪。
- 一边修剪草坪一边看 Netflix。
- 当草坪修剪完并且电影结束时,告诉配偶草坪修剪完了。
显然,这些是非常不同的工作流程。两者都是异步的,但只有后者有一个异步等待。我们异步地等待告诉配偶草坪已经修剪过了,直到它真正修剪完。
关于c# - Task.Run() 和 await Task.Run() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37360905/