我从哪里调用异步方法?

本文关键字:异步方法 调用 | 更新日期: 2023-09-27 17:53:21

我在调用异步方法时遇到了一点麻烦。该方法在一个类中,并加载一个文本文件。我想在应用程序启动时加载文本文件。但是,我不能从构造函数调用异步方法。我在网上看到的大多数例子通常是从异步按钮按下事件调用方法。

目前,我正在尝试从我的构造函数:

Task.Run(async () =>
{
    this.categories = await GenerateCategories(numberOfCategories);
});

虽然这可以工作,但是程序的其余部分在调用该方法后继续执行,并且使用"categories"的代码执行导致崩溃(因为categories仍然为空,因为任务尚未完成)。

总之,从哪里以及如何调用这个方法是最好的?我不希望它在用户按下按钮或任何东西时加载,我希望在任何代码执行之前填充"类别"。

我正在使用c#和编写一个通用的应用程序,所以加载文件必须是异步的。

我从哪里调用异步方法?

我在我的博客上有一个关于在"不可能"的情况下使用async的系列;有一篇文章特别介绍了async的建造者。

因为你正在编写一个通用的应用程序,重要的是要记住,用户界面必须立即(同步)显示;在初始视图显示之前执行异步工作是不可能的。相反,你应该(同步地)初始化/构造为"loading"状态,然后在文件加载时更新你的UI。

我在MSDN上有一个关于MVVM应用程序异步模式的三部分系列文章,您可能会觉得有帮助。

简单的答案是task. run()返回一个任务。如果在任务上调用. wait()方法,线程将暂停,直到任务完成并设置categories成员。

但是,这忽略了该方法可能是异步创建的原因。您可能不想占用UI线程Wait()来等待异步方法完成。您可能还需要注意任务手册页上的这条说明。运行:

语言编译器使用Run(Func)方法来支持async和await关键字。它不打算被直接调用从用户代码。

相反,你可以创建一个async void方法从构造函数中调用,它将在后台线程中异步运行任务。您应该确保所有依赖于已运行的GenerateCategories的逻辑都是从该方法运行的。

要正确使用异步方法,必须将它们的控制流与主用户界面线程解耦。您可以使用Control从任务内部向UI发送消息。当任务需要通知UI其进度时调用。