我有一个接受文件的控制器操作,解析文件并从中导入数据,然后返回一个文件:
public FileResult ImportDevices()
{
HttpPostedFileBase csvFile = Request.Files[0] as HttpPostedFileBase;
if (csvFile != null || csvFile.ContentLength != 0)
{
SaveDevicesResult result = CADC.SaveCSVDeviceData(csvFile.InputStream);
string csvString = result.ToString();
UTF8Encoding encoding = new UTF8Encoding();
byte[] bytes = encoding.GetBytes(csvString);
return File(bytes, "text/txt", "ImportResults.txt");
}
return null; // Not sure how to handle this case, that's another question though!
}
我希望这可以阻止,因为导入可能需要一段时间。我希望用户能够浏览页面,并在文件准备好后将其作为下载文件返回。
我是否遵循此:http://msdn.microsoft.com/en-us/library/ee728598%28v=vs.100%29.aspx
或者我使用async并等待?
或者他们是同一件事而且我很困惑?
答案 0 :(得分:1)
您需要编写一个异步控制器方法来处理此问题,您还必须重写SaveCSVDeviceData
方法以返回Task<SaveDevicesResult>
。你在这里尝试做的是通过async / await模式完成,可以通过以下
public async Task<ActionResult> ImportDevicesAsync()
{
var csvFile = Request.Files[0] as HttpPostedFileBase;
if(csvFile != null && csvFile.ContentLength != 0)
{
// Note: I would recommend you do not do this here but in a helper class
// for this to work, SaveCSVDeviceDataAsync *must* return a Task<object>()
var result = await CADC.SaveCSVDeviceDataAsync(csvFile.InputStream);
var csvString = result.ToString();
var encoding = new UTF8Encoding();
var bytes = encoding.GetBytes(csvString);
// if you are returning a csv, return MIME type text/csv
return File(bytes, "text/txt", "ImportResults.txt");
}
// If the file is null / empty, then you should return
// a validation error
return Error(500, ...);
}
正如我所提到的,为了实现这一点,您的CADC.SaveCsvDeviceData
必须返回Task<SaveDevicesResult>
。鉴于您正在传递该方法InputStream
我将提醒您InputStream
上的所有方法在.NET 4.5 +中都有一个等待它们的替代方法。
答案 1 :(得分:0)
它们不是一回事,你发布的链接属于MVC 1.0,它是一种古老的做法。对于MVC 4,请参阅Using Asynchronous Methods in ASP.NET MVC 4。