从构造函数调用的异步方法

Aln*_*dru 1 c# methods constructor asynchronous async-await

我有一个关于我在构造函数中调用的异步方法的问题以及如何解决或者是否有一个好的解决方法,这是一个示例

public Constructor()
{
 Value = PopulateValueFromDB(); //async method
 CalculateInDB(); // async method
}

public async Task<string> PopulateValueFromDB()
{
 ... do some async calls
 return await ...
}

public async Task CalculateInDB()
{
 ...
 return await ...
}
Run Code Online (Sandbox Code Playgroud)

基本上在构造函数中我有一个错误,因为我不能在那里使用等待,并且我不能使其异步。

对于CalculateInDB,我可以使其返回void,然后我用它解决问题,尽管我在某处读到返回void并不是很好的解决方案。

关于 PopulateVlaue 方法......我必须返回一些东西......

那么,有没有一种解决办法,让我不应该使用这些方法并使它们同步而不是异步?

Ste*_*ary 6

async我有一篇关于构造函数的博客文章,其中涵盖了多种方法。如果可能的话,我建议您使用工厂模式,如下所示:

private Constructor()
{
}

private async Task InitializeAsync()
{
  Value = await PopulateValueFromDBAsync();
  await CalculateInDBAsync();
}

public static async Task<Constructor> Create()
{
  var ret = new Constructor();
  await ret.InitializeAsync();
  return ret;
}
Run Code Online (Sandbox Code Playgroud)