【问题标题】:Role of Task.Run in async and awaitTask.Run 在异步和等待中的作用
【发布时间】:2016-09-19 10:44:51
【问题描述】:

我有一个简单的异步和等待程序:

class Program
    {
        static void Main()
        {
           var demo = new AsyncAwaitDemo();
           Task.Run(() => {demo.DoStuff()};

           while (true)
           {
               Console.WriteLine("Doing Stuff on the Main Thread...................");
           }
        }
    }

    public class AsyncAwaitDemo
    {
        public async Task DoStuff()
        {
        await LongRunningOperation();

        }

        private static async Task<string> LongRunningOperation()
        {
            int counter;

            for (counter = 0; counter < 50000; counter++)
            {
                Console.WriteLine(counter);
            }

            return "Counter = " + counter;
        }
    }

我的第一个问题是:

  1. 是否必须在任何 async 和 await 方法中使用 Task.Run,因为我刚刚删除并且程序变得同步。我知道 await 是用于创建暂停点,并且在该线程的等待函数完成之前不会进一步执行。

其次,

  1. 以下代码创建时有多少线程?

    Task.Run(() => {demo.DoStuff()};

    如果大于1,则线程数取决于内部操作,在本例中为带计数器的for循环。

我开始了解 C# 中的异步编程,阅读并练习了一些示例。除了我上面要求的说明之外,我几乎可以了解上下文。

【问题讨论】:

标签: c# .net multithreading asynchronous


【解决方案1】:

async/await与Task.Run无关;但是,它们在某些情况下确实可以很好地协同工作。

Task.Run 在线程池线程上运行一些代码。 async/await 是一种代码转换,允许您以更自然、命令式的方式编写异步代码(有关async 工作原理的更多详细信息,请参阅我的async intro)。

是否必须在任何 async 和 await 方法中使用 Task.Run,​​因为我刚刚删除并且程序变为同步。

一点也不! async/await 是非常常用的,没有Task.Run。只要你有一个真正的异步操作,你就可以使用async/await。一般来说,任何基于 I/O 的东西都是自然异步操作的一个很好的例子。因此,您可以使用 HttpClient.GetStringAsync 之类的东西,只使用 async/await 而不使用任何 Task.Run。

但是请注意,使用async 而不使用await 几乎总是错误的。编译器会给你一个LongRunningOperation 的警告,告诉你它实际上不是异步的。

以下代码创建时有多少线程? Task.Run(() => {demo.DoStuff()};

该代码只是将DoStuff 排队到线程池中。线程池线程将执行DoStuff。线程的创建取决于许多其他因素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2019-02-19
    相关资源
    最近更新 更多