Задача C # продолжается, не работает должным образом - PullRequest
0 голосов
/ 22 сентября 2018

Как дождаться завершения предыдущего метода, прежде чем продолжить выполнение?Я думал, что это будет легко, но это не так.Я должен делать что-то действительно глупое, хотя я прочитал много примеров.В следующем коде я не могу позволить методу GetDocVM () выполняться до тех пор, пока метод AddUserDocuments () не завершится.Зачем?Потому что GetDocVM () не будет извлекать только что добавленные записи.Я унаследовал этот код и пытаюсь его улучшить.

ut.ModelJSON = await Task.Run(() => _userTransactionService.ConvertToModelJson(typeof(UserDocument).Name, "", transactionDocs)).ConfigureAwait(false);
var taskReturnsVoid = Task.Run(() => _genericUploadService.AddUserDocuments(ut, docs));
List<GenericUploadDocumentViewModel> viewModel = new List<GenericUploadDocumentViewModel>();
await taskReturnsVoid.ContinueWith((t) =>
           {
                 viewModel = GetDocVM();//I EXPECTED THIS TO WAIT TO BE EXECUTED
           });
return Json(viewModel, JsonRequestBehavior.AllowGet);  //GETTING HERE TOO SOON

1 Ответ

0 голосов
/ 22 сентября 2018

Я не завидую вам, поскольку это выглядит ужасно плохой базой кода, только эти несколько строк страдают от множества проблем.

Одна из самых больших из них - то, что вы не должны запускать работу, связанную с процессором, используя Task.Run в ASP.NET.Это , что Стивен Клири пишет об этом :

Асинхронизация и ожидание в ASP.NET - все о вводе / выводе.Они действительно преуспели в чтении и записи файлов, записей базы данных и API REST.Тем не менее, они не подходят для задач, связанных с процессором.Вы можете начать некоторую фоновую работу, ожидая Task.Run, но в этом нет никакого смысла.Фактически, это фактически повредит вашей масштабируемости, мешая эвристике пула потоков ASP.NET.Если у вас есть работа с процессором в ASP.NET, лучше всего выполнить ее непосредственно в потоке запросов.Как правило, не помещайте работу в пул потоков в ASP.NET.

(я рекомендую прочитать его статьи , так как это отличный источник асинхронной / awaitзнание.)

Итак, ваш код очищен:

ut.ModelJSON = _userTransactionService.ConvertToModelJson(typeof(UserDocument).Name, "", transactionDocs);
_genericUploadService.AddUserDocuments(ut, docs);
List<GenericUploadDocumentViewModel> viewModel = GetDocVM();
return Json(viewModel, JsonRequestBehavior.AllowGet);

Однако я подозреваю, что _genericUploadService.AddUserDocuments и GetDocVM делают некоторые операции ввода-выводаO связанная работа (например, работа в сети или доступ к БД).Если вы хотите улучшить производительность своего кода, вам следует переписать их как асинхронные, тогда вы можете получить следующее:

ut.ModelJSON = _userTransactionService.ConvertToModelJson(typeof(UserDocument).Name, "", transactionDocs);
await _genericUploadService.AddUserDocumentsAsync(ut, docs);
List<GenericUploadDocumentViewModel> viewModel = await GetDocVMAsync();
return Json(viewModel, JsonRequestBehavior.AllowGet);
...