2014-03-27 94 views
1

我有一些代码,它导入一个csv文件并从数据创建数据库记录。使用标准的同步方法可以正常工作,但大型csv文件可能需要一段时间才能处理。使用异步等待,我想csv处理异步运行,所以用户不会卡在上传表单,直到处理完成。MVC异步等待长时间运行的数据库插入/更新

因此,用户将上传文件并立即转移到一个页面,该页面将显示一条消息以指示该文件正在导入。

这是我试过的。这是我的控制器的行动,获取表单POST:在本

public async Task<ActionResult> UploadBulkImportFile(BulkUploadCsvModel model, HttpPostedFileBase file) 
{ 
... 

我打电话,我要异步运行的功能:

await Task.Run(() => testAsyncMethod(csvmodel)); 

的testAsyncMethod()做了所有的数据库CRUD参与操作处理csv。

public void testAsyncMethod(IEnumerable<List<csvmodel>> model) 
{ 
... 

此代码的工作,但我前面的同步代码没有什么不同,即用户仍然必须等待,直到该文件被完全处理,所以它显然不正常。请注意,testAsyncMethod()中的代码不是异步代码,只是标准的数据库调用 - 我想知道如果这是我出错的地方。

这甚至可能在MVC?我是否使用异步等待错误的原因?

+0

这不是如何异步工作... –

+0

@ErikFunkenbusch - 照顾开导我? – markpsmith

+0

斯蒂芬的博客文章,他链接到下面明确解释...但是,异步允许*服务器*继续做其他事情,而不是客户端(网络浏览器) –

回答

3

因此,用户将上传文件,并立即转移到一个页面,该页面将显示一条消息以指示该文件正在导入。

这不可能使用异步控制器操作。这是因为(正如我在我的博客中描述的)async does not change the HTTP protocol

在你的情况,我建议你在客户端JavaScript来断火的POST,当前页更改为“导入......”的字样,然后更新同一页当POST请求完成。

然后从您的控制器操作中删除async/await/Task.Run;它不会提供任何好处。

+0

实时报告是不重要的,我只是想要特定位的功能异步运行。您的博客文章很有用,实际上这部分'您可以在服务器上发明“工作流程”的概念:POST调用可以创建工作流程'听起来像我想做的事情 – markpsmith

+0

是的;这实际上是一个更复杂的解决方案,但肯定是可行的。在这种情况下,您需要拥有一个拥有独立后端的持久队列(例如,Azure队列/ MSMQ)(例如,Azure worker/Win32服务)。 –

+0

在做了一些更多的研究后,我认为我所追求的本质上是一场“火与忘”的异步调用,尽管这不是没有缺点。 – markpsmith