在MVC中异步调用控制器操作

时间:2016-01-18 04:34:48

标签: c# asp.net-mvc multithreading

我的MVC 5应用程序中有一个Controller,如下所示;

public class DownloadController : Controller
{
    public FileContentResult CsvDownload(string fileName)
    {
        byte[] data = GetCSVData(fileName);
        return File(data, "text/csv", fileName);
    }
}

我也在DownloadController中有一些其他的动作。我想将CsvDownload文件结果转换为异步任务,因为有时数据可能需要一些时间来处理。如何异步运行CsvDownload函数,以便它不会阻塞主线程。有时下载数据大约需要2到4分钟。

在同一个控制器中,在单独的线程上运行方法的首选解决方案是什么。

修改

当我遇到以下内容时,我正在寻找解决方案: http://blog.newslacker.net/2013/03/aspnet-mvc-how-to-make-working-progress.html

如果我能得到类似以下内容的解决方案:

public delegate string GetCsvDataCaller(string fileName);
public string GetCsvData(string fileName)
{
    string file = "filename.csv";
    //Get CSV Data
    return file;
}
public JsonResult StartExporting(string fileName)
{            
    var caller = new GetCsvDataCaller(GetCsvData);
    caller.BeginInvoke(fileName, GetCsvCallBack, null);

    return Json(new { Status = "started" }, JsonRequestBehavior.DenyGet);
}
public JsonResult GetCsvCallBack(IAsyncResult ar)
{
    AsyncResult result = (AsyncResult) ar;
    AsyncMethodCaller caller = (AsyncMethodCaller) result.AsyncDelegate;
    string returnValue = caller.EndInvoke();
   return Json(new { FileName = returnValue }, JsonRequestBehavior.DenyGet);
}

这可以在ASP.NET MVC中使用吗?

1 个答案:

答案 0 :(得分:1)

public class DownloadController : Controller
{
 [HttpPost]
 public async Task<ActionResult> CsvDownload(string fileName)
 {
       byte[] data = await Task.Run(() => GetCSVData(fileName));
        return File(data, "text/csv", fileName);
 }

}