Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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# 与返回任务的普通方法相比,带有wait的异步方法_C#_Asynchronous_Async Await - Fatal编程技术网

C# 与返回任务的普通方法相比,带有wait的异步方法

C# 与返回任务的普通方法相比,带有wait的异步方法,c#,asynchronous,async-await,C#,Asynchronous,Async Await,在以下程序中: using System; using System.Threading; using System.Threading.Tasks; class Program { static async Task f() { void action() { Thread.Sleep(100); Console.WriteLine("4");

在以下程序中:

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async Task f()
    {
        void action()
        {    
            Thread.Sleep(100);
            Console.WriteLine("4");
            Thread.Sleep(100);
        }
        await Task.Run(action);
    }
    static async void g()
    {
        Thread.Sleep(100);
        Console.WriteLine("1");
        Console.WriteLine("2");
        await f();
        Console.WriteLine("5");
    }
    static void Main()
    {
        g();
        Console.WriteLine("3");
        Console.ReadKey();
    }
}
我可以更改函数
f
,并将其编写为:

static Task f()
{
    void action()
    {
        Thread.Sleep(100);
        Console.WriteLine("4");
        Thread.Sleep(100);
    }
    return Task.Run(action);
}
输出不变。哪个是首选?带有
wait
的异步
f
或返回
任务的正常
f

编辑:两种情况下的输出:

 1
 2
 3
 4
 5

好的,问得好。让我解释一下, 如果您使用了
async void
,并且该方法抛出了一些异常,因为该过程在没有等待
的情况下完成,系统将无法处理该异常,并且该过程将终止应用程序

始终建议使用
异步任务
异步任务或异步任务
只要在调用时等待该方法,以检查每个发生的是否正常


对我们来说,这是一种不好的做法
async void

async void g
是一个bug。这是迫不及待的。对于不返回任何结果的方法,请使用
async Task
<代码>等待
等待已激活的异步操作完成,而不阻塞调用者。您不能将
wait
与返回
Task
的方法进行比较,因为它们根本不做相同的事情。您可以使用
await
等待由返回task@PanagiotisKanavos你能帮我更正一下代码吗?在你的例子中,
的输出没有改变
不是真的。如果没有使用
ReadKey
阻塞主线程,应用程序将在不等待其他方法完成甚至启动的情况下终止。您必须使用
async Task Main()
await g()为确保应用程序正常工作,这是否回答了您的问题?也值得一读:-StevenC的博客你是说异常处理在这两种情况下是不同的吗?如果从异步void方法抛出,则无法处理异常。尝试从async void方法引发新异常,看看会发生什么,在调用方法中使用Try catch。我的测试表明,如果在
f
中引发异常,则两种情况下的结果相同。
f
类型为
async void
async Task
?您可以在问题中看到完整的程序。包括
f
的定义。