C# 从调用方的角度来看,调用异步方法与调用同步方法有何不同?

C# 从调用方的角度来看,调用异步方法与调用同步方法有何不同?,c#,.net,multithreading,asynchronous,async-await,C#,.net,Multithreading,Asynchronous,Async Await,我不明白的是以下片段: 请注意,该方法现在标记为new async关键字;这是 只是编译器的一个指示符,让它知道 在该方法的上下文中,关键字await将被视为一个点 工作流将控件返回给调用方并再次拾取 当关联的任务完成时 这与非async方法的工作方式有什么不同 如果我这样做 int x; x = SomeNormalFunctionThatReturnsAnInt(); Console.WriteLine(x); 或 intx; Task Task=SomeAsyncFunctionTh

我不明白的是以下片段:

请注意,该方法现在标记为new async关键字;这是 只是编译器的一个指示符,让它知道 在该方法的上下文中,关键字await将被视为一个点 工作流将控件返回给调用方并再次拾取 当关联的任务完成时

这与非
async
方法的工作方式有什么不同

如果我这样做

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

intx;
Task Task=SomeAsyncFunctionThatReturnsAnInt();
x=等待任务;
控制台写入线(x);

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

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

如果您没有等待,函数x的结果可能无法初始化。但在这里,您需要等待它,这样就没有区别了。

您需要对异步和同步进行一些读取,以查看性能级别会发生什么

在您的示例中,结果与您所说的wait-in-line-of-wait中的wait方法相同,但让我们看看下面的代码片段

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”;
  }
}
类程序{
私有静态字符串结果;
静态void Main(){
说点什么;
控制台写入线(结果);
}
静态异步任务{
等待任务。延迟(5);
结果=“你好,世界!”;
返回“某物”;
}
}
你能试着计算输出吗,结果什么都没有,为什么

在等待中,我们让主任务继续执行,因为我们在返回结果之前等待了5毫秒,请查看


您需要对异步和同步进行一些读取,以查看性能级别会发生什么

在您的示例中,结果与您所说的wait-in-line-of-wait中的wait方法相同,但让我们看看下面的代码片段

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”;
  }
}
类程序{
私有静态字符串结果;
静态void Main(){
说点什么;
控制台写入线(结果);
}
静态异步任务{
等待任务。延迟(5);
结果=“你好,世界!”;
返回“某物”;
}
}
你能试着计算输出吗,结果什么都没有,为什么

在等待中,我们让主任务继续执行,因为我们在返回结果之前等待了5毫秒,请查看

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

是和否

如果您
在所有任务返回给您后等待
,然后,则该方法在隔离状态下会看到相同的“执行顺序”。这实际上就是
async
/
await
的全部要点-它允许以非常自然的方式编写大多数异步代码,并且类似于等效的同步代码

但是,调用方必须知道它必须是异步的。也就是说,调用方通常使用
wait
,这意味着它必须是
async
。异步代码中增加了一些扭曲。举个例子:如果这是在UI线程上执行的,那么同步代码知道在返回int和Console.WriteLine的
somenormalfunction之间的UI线程上不能执行任何其他操作;但是,异步代码使用
await
,因此它必须接受在
someasynchfunction(返回一个int
Console.WriteLine
之间的UI线程上可以执行任何其他操作。因此,从这个上下文来看,它是不完全相同的;异步方法可能会在其他代码运行时暂停其“执行顺序”

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

是和否

如果您
在所有任务返回给您后等待
,然后,则该方法在隔离状态下会看到相同的“执行顺序”。这实际上就是
async
/
await
的全部要点-它允许以非常自然的方式编写大多数异步代码,并且类似于等效的同步代码


但是,调用方必须知道它必须是异步的。也就是说,调用方通常使用
wait
,这意味着它必须是
async
。异步代码中增加了一些扭曲。举个例子:如果这是在UI线程上执行的,那么同步代码知道在返回int
和Console.WriteLine的
somenormalfunction之间的UI线程上不能执行任何其他操作;但是,异步代码使用
await
,因此它必须接受在
someasynchfunction(返回一个int
Console.WriteLine
之间的UI线程上可以执行任何其他操作。因此,从这个上下文来看,它是不完全相同的;异步方法的“执行顺序”可能会在其他代码运行时暂停。

Task.Delay需要毫秒而不是秒,如果要等待5秒,则为Task.Delay(5000)Task.Delay需要毫秒而不是秒,如果要等待5秒,则为Task.Delay(5000)