Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我对async Wait的理解正确吗?_C#_.net_Multithreading_Asynchronous_Async Await - Fatal编程技术网

C# 我对async Wait的理解正确吗?

C# 我对async Wait的理解正确吗?,c#,.net,multithreading,asynchronous,async-await,C#,.net,Multithreading,Asynchronous,Async Await,我至少读过十几篇关于它的文章,我想我终于明白了。批评我下面的解释 如果在函数中使用async关键字,它向函数的调用者发出信号,当它到达函数内部的wait关键字时,它可以在函数调用后继续执行任何独立工作,直到返回waited函数的结果,然后它可以从调用的地方返回finish停止。关键字async不会影响被调用方等待的任何内容。等待任何任务都是合法的,不管它来自哪里。让我们看看这个例子: async Task Main() { Console.WriteLine("Starting A no

我至少读过十几篇关于它的文章,我想我终于明白了。批评我下面的解释


如果在函数中使用
async
关键字,它向函数的调用者发出信号,当它到达函数内部的
wait
关键字时,它可以在函数调用后继续执行任何独立工作,直到返回
wait
ed函数的结果,然后它可以从调用的地方返回finish停止。

关键字
async
不会影响被调用方等待的任何内容。等待任何
任务
都是合法的,不管它来自哪里。让我们看看这个例子:

async Task Main()
{
    Console.WriteLine("Starting A now.");
    GetResult();
    Console.WriteLine("Finished A now.");

    Console.WriteLine("Starting B now.");
    await GetResult();
    Console.WriteLine("Finished B now.");

    Console.WriteLine("Starting C now.");
    GetResultAync();
    Console.WriteLine("Finished C now.");

    Console.WriteLine("Starting D now.");
    await GetResultAync();
    Console.WriteLine("Finished D now.");
}

Task GetResult()
{
    return Task.Delay(5000).ContinueWith(a => Console.WriteLine("Finished!"));
}

async Task GetResultAync()
{
    await Task.Delay(5000).ContinueWith(a => Console.WriteLine("Finished!"));
}
如您所见-
Main
能够等待结果,而不管该方法是否为
async
。Async只是指示编译器:

  • 该方法将调用
    async
    ,需要转换为状态机,并且
  • 写入
    时,返回a
    (其中
    a
    int
    ),将结果包装到
    任务中
  • “async”修饰符用于方法声明/签名以指示(向编译器)该方法可能使用“wait”调用一个或多个异步操作。“async”允许在方法内部使用“await”。 “async”修饰符不在方法内部使用,它用于方法签名,如“public”和“private”关键字

    比如:()

    公共异步任务访问WebAsync(){…}
    
    您可以按如下方式调用上述方法:

    Task<int> accessWebTask = AccessTheWebAsync();
    ... --> code that does not depend on the result of the previous line
    var result = await accessWebTask;
    ... --> code that should not execute until the operation above is done
    
    or shorter form:   
    10 var result = await AccessTheWebAsync();
    11    ... code after awaited operation
    
    Task accessWebTask=AccessTheWebAsync();
    ... --> 不依赖于前一行结果的代码
    var result=等待访问webtask;
    ... --> 在完成上述操作之前不应执行的代码
    或简称:
    10 var result=等待访问WebAsync();
    11    ... 等待操作后的代码
    
    “Wait”(等待)运算符表示暂停点,也就是说,等待操作后的代码要求等待操作(第10行)完成,然后才能执行其余代码(第11行等)。 “等待”可以用于返回无效的方法,在这种情况下,没有等待,这是一个火和忘记操作

    编译器代表您生成代码,以便所有这些都可以工作

    “async/await”的另一个好处是在代码可读性(线性流,异步代码读起来像同步的)和异常处理方面,大多数情况下

    还要记住,“async/await”与多线程几乎没有关系。它旨在帮助实现非阻塞操作(db/文件系统/网络)和UI响应

    如果您对更具概念性的观点感兴趣,请阅读本文: ()


    这个问题的简单答案是“是”。这是一个常见的误解,但必须正确:你不等待方法,你只等待任务!在许多情况下,您等待的任务不是通过异步方法创建的。删除了有问题的句子,但为了清楚起见,“await”关键字只能在标记有“async”修饰符的方法中使用。
    Task<int> accessWebTask = AccessTheWebAsync();
    ... --> code that does not depend on the result of the previous line
    var result = await accessWebTask;
    ... --> code that should not execute until the operation above is done
    
    or shorter form:   
    10 var result = await AccessTheWebAsync();
    11    ... code after awaited operation