C# 如何创建等待类?

C# 如何创建等待类?,c#,windows-runtime,async-await,C#,Windows Runtime,Async Await,可能重复: 我有一个班级的例子,从互联网上收集了一些关于创作的信息 public class Example { string information; public Example() { //Pull information } } public async void SetupSomething() { Example ex = new Example(); await ex; // Do somethi

可能重复:

我有一个班级的例子,从互联网上收集了一些关于创作的信息

public class Example
{
    string information;    

    public Example()
    {
        //Pull information
    }
}
public async void SetupSomething()
{
    Example ex = new Example();
    await ex;
    // Do something with ex
}
现在我想让示例变得可以期待,因为在创建后继续部分之前创建示例是很重要的

public class Example
{
    string information;    

    public Example()
    {
        //Pull information
    }
}
public async void SetupSomething()
{
    Example ex = new Example();
    await ex;
    // Do something with ex
}

我怎样才能做到这一点呢?

好吧,构造函数应该等到它完成了它的工作。毕竟,用于创建它的线程来自调用它的方法

然而,我认为非常重要的是,向我们展示构造函数在做什么。它很有可能在某个地方调用某个启动另一个线程的东西,而不是等待它解决,从而使构造函数返回,而不具有您所谈论的所有“信息”


可能类似于:

您可以这样做,但我认为这不是一个好方法,因为在开始使用该实例之前,没有任何东西强迫
等待

我认为一个好主意是创建创建对象的静态异步方法。比如:

class Example
{
    private Example()
    {
    }

    private async Task InitializeAsync()
    {
        // get the required data asynchronously here
    }

    public static async Task<Example> CreateAsync()
    {
        var result = new Example();
        await result.InitializeAsync();
        return resul;
    }
}
类示例
{
私人示例()
{
}
专用异步任务InitializeAsync()
{
//在此处异步获取所需的数据
}
公共静态异步任务CreateAsync()
{
var result=新示例();
等待结果。初始化同步();
返回结果;
}
}

只有向下投票,因为它实际上没有回答问题。@问题是,当构造涉及
wait
ing时,如何创建类。由于构造函数不能是异步的,所以可以使用工厂方法。在OP给出的示例中(
var ex=new example();await ex;
),您没有回答如何创建可等待的类,而是回答了如何绕过不可等待的构造函数。这可能不是你的错;也许OP放得不好。要创建一个可等待的类,您只需要有一个GetAwaiter()方法。我投票赞成重新打开,因为这个问题实际上可以在它的原始上下文中得到回答,而与异步构造函数无关。正如svick所建议的,我不认为这是一个很好的方法,但老实说。。。除了有点奇怪而且读起来不太好之外,我无法解释为什么。但你确实可以做到。有一篇很好的博客文章回答了真正的问题: