【发布时间】:2021-09-19 21:12:53
【问题描述】:
我正在尝试像这样从 web api 调用一个长时间运行的任务
[HttpGet]
public async Task<IActionResult> Get()
{
await Task.Run(()=>_report.TestFunctionAsync());
return Accepted();
}
这就是任务
public async Task TestFunctionAsync()
{
ProcessStatus = 0;
Task.Delay(TimeSpan.FromSeconds(30));
ProcessStatus = 1;//wrting to DB
Task.Delay(TimeSpan.FromSeconds(10));
ProcessStatus = 2;//Fetching from Excel
Task.Delay(TimeSpan.FromSeconds(20));
ProcessStatus = 3;//Processing
Task.Delay(TimeSpan.FromSeconds(50));
ProcessStatus = 9;//Finished
}
但是当我从 UI 的角度进行谷歌搜索时,我发现它的异步和 UI 永远不会被阻止。但这不是正确的方法。
所以请提出一种更好的实现方式。还有什么方法可以了解异步任务的状态(使用 ProcessStatus 属性)
【问题讨论】:
-
您的问题是“如何在不阻塞 UI 的情况下从 ASP.NET Web API 调用长时间运行的任务?”
-
好的,从阅读this开始。这是一系列帖子,详细解释了如何按照您的要求进行操作,并且以持久、可靠和 ASP.NET MVC 友好的方式进行。
-
是的,那是真的.. 我的问题是如何在不阻塞 ui 的情况下从 web api 调用长时间运行的任务
-
阅读我链接的系列文章。
-
Its async and UI never be blocked你有一个负责分派请求的主线程(尽管 Kestrel 非常擅长使用它,因此净效果远不如 IIS 上的旧 ASP.Net 中那么明显)。因此,对于 Web 开发人员而言,避免阻塞它与桌面开发人员在 UI 线程方面的优先级相同。正确的方法是将其托管在不同的应用程序请求中,这些请求通过某种队列分派。具体细节很大程度上取决于您的环境、托管选项、预算等
标签: c# asp.net-web-api .net-core