【发布时间】: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 应用程序中,每个请求都已经在它们自己的线程中运行。多开几个线程会填满线程池,让你的代码等待线程被释放,让一切变慢。
-
@Andre
async不 “打开新线程”...async/await真的与线程没有多大关系(除非你知道特定操作确实会创建线程,但大多数常规操作(如 web/IO 请求)不会)。请注意,这也不是新概念 - 查看 2006 年的 Asynchronous vs Threading 帖子
标签: c# asynchronous methods constructor async-await