等待任务完成,在“等待”之后进行操作

c#

我知道我可能被否决了,但显然我只是不太了解 async-await 和我发现的问题/答案,以及我发现的文章,并没有帮助我找到这个问题的答案:

我怎样才能打印出“2”?或者实际上,为什么 2 在 await t 和 t.Wait() 中都没有打印出来?:

static Task t;
public static async void Main()
{
    Console.WriteLine("Hello World");
    t = GenerateTask();     
    await t;
    //t.Wait();
    Console.WriteLine("Finished");
}

public static Task GenerateTask()
{
    var res = new Task(async () => 
    {
        Console.WriteLine("1");
        await Task.Delay(10000);
        Console.WriteLine("2"); 
    });
    res.Start();
    return res;
}

编辑:我正在创建一个任务并返回它,因为在现实生活中我需要稍后从不同的方法等待这个任务。

Edit2: await Task.Delay 只是现实生活中等待不同函数的占位符。

回答

打印“2”

2 实际打印,在 1 打印后 10 秒。如果Console.ReadLine();在打印“完成”后添加,您可以观察到这一点。

输出是

Hello World
1
Finished
2

怎么了?

当您等待tresGenerateTask方法中)时,您正在等待创建的任务而不是res创建的任务。

如何修复(花哨的方式)

您将需要等待外部任务和内部任务。为了能够等待内部任务,您需要公开它。要公开它,您需要将任务类型从TasktoTask<Task>和返回类型从Taskto 更改Task<Task>

它可能看起来像这样:

public static async Task Main()
{
    Console.WriteLine("Hello World");
    var outerTask = GenerateTask();     
    var innerTask = await outerTask; // what you have 
    await innerTask;                 // extra await
    Console.WriteLine("Finished");
    Console.ReadLine();
}

public static Task<Task> GenerateTask() // returns Task<Task>, not Task
{
    var res = new Task<Task>(async () => // creates Task<Task>, not Task
    {
        Console.WriteLine("1");
        await Task.Delay(TimeSpan.FromSeconds(10));
        Console.WriteLine("2"); 
    });
    res.Start();
    return res;
}

现在的输出是:

Hello World
1
2
Finished

如何修复(简单的方法)

不需要外部任务。

public static async Task Main()
{
    Console.WriteLine("Hello World");
    var t  = GenerateTask();     
    await t;
    Console.WriteLine("Finished");
    Console.ReadLine();
}

public static async Task GenerateTask()
{
    Console.WriteLine("1");
    await Task.Delay(TimeSpan.FromSeconds(10));
    Console.WriteLine("2"); 
}


以上是等待任务完成,在“等待”之后进行操作的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>