【发布时间】:2022-12-09 16:47:13
【问题描述】:
带有 .NET Framework v4.5.2 的 ASP.NET MVC 5
我有一个已分配给我的大型现有项目。它的某些部分需要很长时间,所以我想看看如何将这些“对我来说是新的”异步调用放入代码中。
但是,在查看示例之后,我不知道我所拥有的是否可以做到这一点。
在我的控制器上采用这种典型方法:
public ActionResult DealerSelect()
{
var model = RetailActivityModelData.GetCurrentDealers(null, ViewBag.Library);
return View(model);
}
我真的不明白如何把它变成异步调用,除非我做了这样的事情:
public async Task<ActionResult> DealerSelect()
{
var model = await RetailActivityModelData.GetCurrentDealers(null, ViewBag.Library);
return View(model);
}
但是编译器抱怨:
异步方法的返回类型必须是 void、Task、Task、类似任务的类型、IAsyncEnumerable 或 IAsyncEnumerator
我不确定如何在不破坏 View 模型的情况下更改返回类型。
因此,我进入
GetCurrentDealers方法进行基本的 BackgroundWorker 调用:public static DealerModel GetCurrentDealers(DealerModel model, string library) { m_library = library; if (model == null) { model = new AdminCurrentDealerModel(); } using (var bg = new BackgroundWorker()) { var mre = new ManualResetEvent(false); bg.DoWork += delegate (object s, DoWorkEventArgs e) { // fill 3 DataTables with calls to database }; bg.ProgressChanged += delegate (object s, ProgressChangedEventArgs e) { // add data from DataTables to model }; bg.RunWorkerCompleted += delegate (object s, RunWorkerCompletedEventArgs e) { mre.Set(); }; bg.RunWorkerAsync(); if (bg.IsBusy) { mre.WaitOne(); } } return model; }它编译得很好,但一旦调用
bg.RunWorkerAsync()就会崩溃:System.InvalidOperationException:'此时无法启动异步操作。异步操作只能在异步处理程序或模块中或在页面生命周期中的某些事件期间启动。如果在执行页面时发生此异常,请确保页面标记为 <%@ Page Async="true" %>。此异常还可能指示尝试调用“async void”方法,这在 ASP.NET 请求处理中通常不受支持。相反,异步方法应该返回一个任务,调用者应该等待它。
这是一个 ASP.NET MVC Razor 页面,因此它实际上没有
<%@ Page Async="true" %>部分。我什至可以在这个项目上进行增量异步开发,还是需要将整个项目转换为使用任务的项目?
【问题讨论】: