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

时间:2014-01-25 18:32:02

标签: c# asynchronous methods constructor 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 ...
}

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

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

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

那么是否有一个解决方法,我不应该使用那些方法然后让它们同步而不是异步?

2 个答案:

答案 0 :(得分:3)

我在async constructors上有一篇博文,内容涵盖各种方法。如果可能,我建议您使用工厂模式,如下:

private Constructor()
{
}

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

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

答案 1 :(得分:-3)

这是使用旧科技的时候了!

ThreadPool.QueueUserWorkItem。

干杯 -