我的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中使用吗?
答案 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);
}
}