从构造函数调用的异步方法[重复]
Posted
技术标签:
【中文标题】从构造函数调用的异步方法[重复]【英文标题】:Async method which is called from constructor [duplicate] 【发布时间】:2014-02-16 17:43:33 【问题描述】:我有一个关于我在构造函数中调用的异步方法以及如何解决的问题,或者有一个好的解决方法,这里是一个例子
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,我可以将其返回无效,然后我用它解决问题,尽管我在某处读到返回无效不是很好的解决方案。
关于 PopulateVlaue 方法...我必须返回一些东西...
那么有没有办法解决我不应该使用这些方法并使它们同步而不是异步?
【问题讨论】:
你为什么要这个?你想做什么?如果您调用尚未初始化的属性,您期望会发生什么? 嗯,我只是想将我所有的方法转换为异步 :) 它是一个 Web 应用程序......是的......当它从数据库中读取数据时,资源对于另一个请求是免费的 当然,没有初始化属性不是这个想法:/ 请不要这样做。异步打开新线程,这是有代价的。使用 async 来并行化慢速计算,等待外部资源响应等等。对快速方法使用异步实际上会使它们变慢。另外,在 Web 应用程序中,每个请求都已经在它们自己的线程中运行。多开几个线程会填满线程池,让你的代码等待线程被释放,让一切变慢。 @Andreasync
不 “打开新线程”...async
/await
真的与线程没有多大关系(除非你知道特定操作确实会创建线程,但大多数常规操作(如 web/IO 请求)不会)。请注意,这也不是新概念 - 查看 2006 年的 Asynchronous vs Threading 帖子
【参考方案1】:
我在async
constructors 上有一篇博文,其中涵盖了各种方法。如果可能,我建议您使用工厂模式,例如:
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;
【讨论】:
我认为private InitializeAsync()
缺少一块;应该是private async Task<Constructor> InitializeAsync()
吗?
感谢:我正在使用它从 Outlook .pst 文件中加载数据;这真的需要异步......很多事情都可能进展缓慢和/或错误
@MarceloScofanoDiniz:已修复,谢谢!【参考方案2】:
现在是使用旧技术的时候了!
ThreadPool.QueueUserWorkItem.
干杯-
【讨论】:
以上是关于从构造函数调用的异步方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章
从 ViewModel 构造函数 Xamarin.Forms 调用异步方法
如何从同一个类中的另一个构造函数调用抽象类的构造函数(方法重载)[重复]