【发布时间】:2015-11-22 07:46:12
【问题描述】:
在我的 ASP.NET 5 应用程序中,我想将一些数据从 Azure 加载到我的 Startup.Configure 方法内的缓存中。 Azure SDK 专门公开异步方法。通常,调用异步方法是通过异步方法中的 await 完成的,如下所示:
public async Task Configure(IApplicationBuilder app, IMemoryCache cache)
{
Data dataToCache = await DataSource.LoadDataAsync();
cache.Set("somekey", dataToCache);
// remainder of Configure method omitted for clarity
}
但是,ASP.NET 5 要求 Configure 方法返回 void。我可以使用 async void 方法,但我的理解是 async void 方法只应该用于事件处理程序(根据https://msdn.microsoft.com/en-us/magazine/jj991977.aspx 等等)。
我在想一个更好的方法是在没有等待的情况下调用异步函数,在返回的任务上调用等待,然后通过 Task.Results 属性缓存结果,如下所示:
public void Configure(IApplicationBuilder app, IMemoryCache cache)
{
Task<Data> loadDataTask = DataSource.LoadDataAsync();
loadDataTask.Wait();
cache.Set("somekey", loadDataTask.Result);
// remainder of Configure method omitted for clarity
}
Stephen Walther 今年早些时候在blog post 中使用了类似的方法。但是,从该帖子中不清楚这是否被认为是可接受的做法。是吗?
如果这被认为是一种可接受的做法,我需要什么(如果有的话)错误处理?我的理解是 Task.Wait() 将重新抛出异步操作抛出的任何异常,并且我没有提供任何机制来取消异步操作。简单地调用 Task.Wait() 就足够了吗?
【问题讨论】:
-
这是一个有趣的问题。我不知道,但我认为 在这种情况下 做 async void 没有副作用。希望有经验的大侠解答一下。
-
async void确实 在这种情况下会产生副作用,因为它会向调用该方法的任何人发出信号,表明他们可以在该方法运行时继续进行其他工作。由于Configure处理应用程序设置,因此在完成之前继续运行应用程序代码的其他部分可能会产生不可预知的后果。 (我们遇到了这个问题,它使我们的应用程序变得混乱,因为依赖注入器注入了尚未正确设置的服务)。 -
这是另一种方法,您可以在网络服务器运行之前运行初始化代码。 stackoverflow.com/a/55707949/1912383
标签: c# asp.net-core async-await