我有一些代码可以导入csv文件并从数据中创建数据库记录。使用标准同步方法可以正常工作,但是大型csv文件可能需要一段时间才能处理。使用异步等待,我希望异步运行csv处理,这样用户就不会停留在上传表单上,直到处理完成为止。
因此,用户将上传文件并立即转移到一个页面,该页面将显示一条消息,指示该文件正在导入。
这是我尝试过的。这是我的控制器操作,其形式为POST:
public async Task<ActionResult> UploadBulkImportFile(BulkUploadCsvModel model, HttpPostedFileBase file)
{
...
在此我调用我想要异步运行的功能:
await Task.Run(() => testAsyncMethod(csvmodel));
testAsyncMethod()完成处理csv所涉及的所有db crud操作。
public void testAsyncMethod(IEnumerable<List<csvmodel>> model)
{
...
此代码有效但与我之前的同步代码没有什么不同,即用户仍需要等到文件完全处理完毕,因此它显然无法正常工作。请注意,testAsyncMethod()中的代码不是异步代码,只是标准的数据库调用 - 我想知道我是否出错了。
这在MVC中甚至可能吗?我是否因为错误的原因而使用异步等待?
答案 0 :(得分:3)
因此,用户将上传文件并立即转移到一个页面,该页面将显示一条消息,指示该文件正在导入。
使用异步控制器操作是不可能的。这是因为(正如我在博客中描述的那样)async
does not change the HTTP protocol。
在您的情况下,我建议在客户端上使用一些JavaScript来启动POST,将当前页面更改为&#34;导入...&#34;消息,然后在POST请求完成时更新同一页。
然后从您的控制器操作中删除async
/ await
/ Task.Run
;它不会带来任何好处。