gpt4 book ai didi

c# - 如何处理 Startup.Configure 中的异步操作?

转载 作者:IT王子 更新时间:2023-10-29 03:44:33 24 4
gpt4 key购买 nike

在我的 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 等)。

我在想更好的方法是调用不带 await 的异步函数,在返回的 Task 上调用 Wait,然后通过 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() 就足够了吗?

最佳答案

您链接到的博客中的示例代码仅使用异步同步来使用示例数据填充数据库;该调用不会存在于生产应用中。

首先,我要说的是,如果您确实需要将 Configure 设为异步,那么您应该向 ASP.NET 团队提出问题,让他们注意到这一点。此时(即发布之前)添加对 ConfigureAsync 的支持对他们来说不会太困难。

其次,您有两种解决问题的方法。您可以使用task.Wait(或者更好的是,task.GetAwaiter().GetResult(),它避免了AggregateException 包装器(如果确实发生错误)。或者,您可以缓存任务而不是任务的结果(如果IMemoryCache 更像是一个字典而不是一些奇怪的序列化- into-binary-array-in-memory 东西 - 我在看你,以前版本的 ASP.NET)。

If this is considered an acceptable practice, what - if any - error handling do I need?

使用 GetAwaiter().GetResult() 会导致异常(如果有)传播到 Configure 之外。不过,我不确定如果配置应用程序失败,ASP.NET 会如何响应。

I haven't provided any mechanism to cancel the async operation.

我不确定如何“取消”应用程序的设置,所以我不会担心这部分。

关于c# - 如何处理 Startup.Configure 中的异步操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32257640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com