c# - Task.Run() 和 await Task.Run() 有什么区别?

标签 c# multithreading asynchronous

以下程序是使用通用 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/

相关文章:

c# - 如何将 System.Linq.Enumerable.WhereListIterator<int> 转换为 List<int>?

c++ - 对于 C++ MacOSX 应用程序,要使用什么线程库?

javascript - Action 必须是普通对象。使用自定义中间件

apache-flex - 将 Web 服务结果与 Flex 中的请求匹配

具有异步函数的 JavaScript 数组

c# - dotnet 新项目无法恢复它的依赖项

c# - 如何从 Exchange 服务器获取联系人列表?

c# - System.Security.Cryptography 与 PCLCrypto

Python:是否有双端队列的线程安全版本?

java - 如何确保我的线程/进程在不同的内核上运行