【问题标题】:From the point of view of the caller, how is calling an asynchronous method any different than calling a synchronous method?从调用者的角度来看,调用异步方法与调用同步方法有何不同?
【发布时间】:2016-05-22 16:57:34
【问题描述】:

看不懂的是下面的sn-p from MSDN:

请注意,该方法现在使用新的 async 关键字进行标记;这是 只是给编译器的一个指示器,让它知道在 此方法的上下文,关键字 await 将被视为一个点 工作流将控制权返回给它的调用者并再次拿起 当相关任务完成时。

这与非async 方法的工作方式有何不同?

如果我这样做了

int x; 
x = SomeNormalFunctionThatReturnsAnInt(); 
Console.WriteLine(x);

int x; 
Task<int> task = SomeAsyncFunctionThatReturnsAnInt();
x = await task; 
Console.WriteLine(x);

那么从调用者的角度来看,执行顺序是完全相同的:定义了一个名为xint,一个函数返回一个int 运行,当该函数运行完成时,其返回值设置为x,然后写入控制台。

【问题讨论】:

    标签: c# .net multithreading asynchronous async-await


    【解决方案1】:

    从调用者的角度来看,执行顺序是完全相同的

    是和不是。

    如果您await 将所有任务都返回给您,那么是的,该方法孤立地看到相同的“执行顺序”。这实际上是async/await 的全部 - 它允许以非常自然且类似于等效同步代码的方式编写大多数异步代码。

    但是,调用者必须知道它必须是异步的。即调用者一般使用await,也就是说一定是async。异步代码带来了一些额外的变化。一个例子:如果这是在 UI 线程上执行的,那么同步代码知道在 SomeNormalFunctionThatReturnsAnIntConsole.WriteLine 之间的 UI 线程上没有其他东西可以执行;但是,异步代码使用await,因此它必须接受在SomeAsyncFunctionThatReturnsAnIntConsole.WriteLine 之间的UI 线程上可以执行的任何其他操作。因此,从上下文来看,它不完全相同;异步方法可能会在其他代码运行时暂停其“执行顺序”。

    【讨论】:

      【解决方案2】:

      如果您不等待函数 x 的结果,则可能无法初始化。但是在这里你等着,所以没有区别。

      【讨论】:

        【解决方案3】:

        您需要阅读异步和同步的一些内容,以了解性能级别会发生什么,

        在您的示例中,结果与您所说的等待排队等待的方法没有什么不同,但让我们看看以下代码 sn-p

        class Program {
          private static string result;
        
          static void Main() {
            SaySomething();
            Console.WriteLine(result);
          }
        
          static async Task<string> SaySomething() {
            await Task.Delay(5);
            result = "Hello world!";
            return “Something”;
          }
        }
        

        你能不能试着计算一下输出,结果什么都没有,为什么?

        通过等待我们让主任务继续,因为我们在返回结果之前等待 5 毫秒,看看

        https://msdn.microsoft.com/en-gb/library/mt674882.aspx

        【讨论】:

        • Task.Delay 需要毫秒而不是秒,如果您想等待 5 秒,那将是 Task.Delay(5000)
        猜你喜欢
        • 1970-01-01
        • 2017-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多