【发布时间】:2016-02-17 13:40:02
【问题描述】:
我正在转换处理 - 解析 - 上传文件的旧 - 旧 - Web 应用程序。它使用纯 javascript + MVC。
/* javascript */
function Parse(files) {
var idFiles=document.getElementById('inputF').value;
CallServer('ProcessFile/Parse', idFiles, function (m)
{
if (m != null)
{
var om = JSON.parse(m);
MsgLog('Parse finished ' + om.msg);
}
});
}
var CallServer = function (url, content, callback) {
var rqs = new XMLHttpRequest();
rqs.open('POST', url, true);
rqs.onreadystatechange = function () {
if (rqs.readyState == 4 && rqs.status == 200) {
callback(rqs.responseText);
return true;
} else { return false; }
};
rqs.send(content);
}
/* View */
...
<a href="#" id="parseFiles" onclick="Parse()" title="Parse selected documents">Parse</a>
...
/* Controller */
public JsonResult Parse(string idFiles){
// parses input string and returns an array of int
int[] idf=getIds(idFiles);
string wholeFile=string.Empty;
string parsedData=string.Empty;
string outputFileName=string.Empty;
List<string> doneFiles=new List<string>();
foreach(int f in idf)
{
wholeFile=ReadFile(f);
parsedData=ParseFile(wholeFile);
outputFileName=SaveParsed(parsedData);
doneFiles.Add(outputFileName);
}
return Json(new { doneFiles });
}
控制器返回数据以查看显示已解析文件的列表。 由于解析需要很长时间才能运行,我正在尝试将此代码转换为 async/await Task + Parallel (?) 代码。我重写了 Parse 方法,但我对 async/await Task + Parallel 的东西有点困惑。 此外,我不知道是否必须更改 javascript。 现在控制器看起来像:
public JsonResult Parse(string idFiles){
int[] idf=getIds(idFiles);
string wholeFile=string.Empty;
string parsedData=string.Empty;
string outputFileName=string.Empty;
List<string> doneFiles=new List<string>();
await Task.Run(() =>Parallel.ForEach(idf, async currFile =>
{
wholeFile=ReadFile(currFile);
Task<string> parseData=ParseFile(wholeFile);
await Task.WhenAll(parseData);
Task<string> write = await parseData.ContinueWith(async (aa) => await SaveParsed(parsedData));
Task.WhenAll(write);
}
return Json(new { doneFiles });
}
我的需求将是一个真正的异步 Parse 方法,完成后更新视图中已解析文件的列表... file1 - 已解析 file2 - 已解析 文件3 -
【问题讨论】:
-
你的问题到底是什么?
-
我不知道我使用语句 Task.Run 和 Parallel.ForEach 使 Parse 方法“异步”的方式是否正确,以及是否必须更改 javascript 调用。
标签: javascript c# asp.net-mvc-4 asynchronous async-await