Я конвертирую свое старое - наследие - веб-приложение, которое обрабатывает - анализирует - загруженные файлы. Он использует чистый javascript + MVC.MVC Javascript xmlhttprequest вызов метода async
/* 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 });
}
Контроллер возвращает данные для просмотра списка разобранных файлов. Поскольку синтаксический анализ занимает много времени, я пытаюсь преобразовать этот код в асинхронный/ожидаемый код Task + Parallel (?). Я переписал метод Parse, но я немного запутался в async/wait Task + Parallel stuffs. Кроме того, я не знаю, нужно ли мне изменять 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 });
}
Мой Desiderata был бы истинным асинхронной Parse метод, который после завершения обновления списка проанализированных файлов в окне ... file1 - разобраны file2 - разобраны file3 -
И что конкретно представляет собой ваш вопрос? –
Я не знаю, правильно ли я использую инструкции Task.Run и Parallel.ForEach, чтобы сделать метод Parse «async» правильным, и если мне нужно изменить также вызов javascript. – user1732337