【问题标题】:C# Async function - using WhenAll function and await word togetherC# Async 函数 - 一起使用 WhenAll 函数和 await 字
【发布时间】:2020-11-02 15:34:04
【问题描述】:

我需要了解一些事情, 我有一个函数,例如:

public static class classExample
{
     public async Task funcAsync()
    {

        List<Task<string>> exampleList= new List<Task<string>>();
        // do stuff          
        await Task.WhenAll(exampleList);
    }
}

在我的主要方法中,我有:

 main()
 {
       classExample.funcAsync();         
 }

如果我像这样在 main 中使用 await 词:

await classExample.funcAsync();

与没有等待在 main 中不同吗?我问是因为我有

await Task.WhenAll(exampleList);

在函数内部。

有什么不同?

还有更多问题,我有这个例子:

async Task function2()
{
    // do stuff
    await //for some code will be done
}

main()
{
    function2();
    function3();
}

如果我不使用等待字所以函数将继续函数3, 在这种情况下,我不需要 function3 等待 function2,这是 可以继续,但问题是:function2 会完成所有工作吗? 如果 function3 将在 function2 结束之前结束所有工作。 在 function3 将结束所有工作之后 main 函数等待 function2 将结束?

谢谢!

【问题讨论】:

  • 你确定不是public static async Task funcAsync()

标签: c# multithreading async-await


【解决方案1】:

如果我像这样在 main 中使用 await 词:await classExample.funcAsync(); 与没有在 main 中等待有什么不同?

是的,funcAsync 返回一个Task,它将在所有exampleList Tasks 完成后完成(由于使用了Task.WhenAll),所以不使用await,你的Main可能会在这些都完成之前退出。

在您的第二个示例中,不等待function2 将允许function3 在不等待function2 完成的情况下执行,但是,如果function3 在从function2 返回的Task 完成之前完成,则您的代码将提前退出。

您可以通过存储对Task 的引用并稍后等待来缓解这种情况:

var task = function2();
function3();
await task;

或者如果function3也返回一个Task

await Task.WhenAll(function2(), function3());

【讨论】:

    猜你喜欢
    • 2018-10-17
    • 2022-11-23
    • 2019-02-17
    • 2021-08-06
    • 2016-03-08
    • 2020-08-01
    • 2021-08-03
    • 2020-09-22
    • 1970-01-01
    相关资源
    最近更新 更多