2

Я пишу приложение магазина Windows и нуждаюсь в некоторой помощи по методу Task.Run. Я вызываю службу для извлечения данных из службы; потому что я хочу, чтобы отменить задание, если интернет отключен я передаю CancellationTokenкак подождать task.run

await Task.Run(async() => await Download1(), cts.Token); 

Существует еще один метод загрузки, который должен работать после этого выше задача выполнена таким образом, я использую Await. Обе задачи записываются в одни и те же файлы, поэтому я хочу убедиться, что они не запускаются параллельно.

await Task.Run(async() => await Download2(), cts.Token); 

Проблема в том, что над задачей 2 начинается без выполнения задачи 1, и поэтому обе задачи выполняются параллельно. Что я делаю неправильно? Пожалуйста, порекомендуйте.

Download1 выглядит следующим образом: -

public async Task Download1() 
     { 
     await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
         async() => 
         { 
          Status = "Downloading!"; 
          var ListSetupTasks = new List<SetupView>(); 
          foreach (var setup in AllSetupTasks.Setup) 
          { 
           ListSetupTasks.Add(new SetupViewModel(setup)); 
          } 

          IEnumerable<Task> downloadTasksQuery = from setup in ListSetupTasks where setup.TaskType == TaskType.Web select _masterlistrepository.GetTask(setup, false, datetime, branch); 
          Task[] downloadTasks = downloadTasksQuery.ToArray(); 
          await Task.WhenAll(downloadTasks); 

          IEnumerable<Task> FinalTasksQuery = from setup in ListSetupTasks where setup.TaskType == TaskType.Web select _masterlistrepository.GetTask(setup, false); 
          foreach (var task in FinalTasksQuery) 
          { 
           await task; 
          } 
         }); 

     } 

CancellationToken используется следующим образом: -

async void NetworkChanged(object sender, NetworkConnectionStatusChangedEventArgs e) 
     { 
      if (e.Value == false && LoadingData == true) 
      { 

      await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
          async() => 
          { 
           await _alertmessageservice.ShowAsync("", "Network error. Please retry!"); 
           cts.Cancel(); 
          }); 

      } 
     } 
+0

Как выглядит 'Download1' и' Download2'? – i3arnon

ответ

5

Вы используете CoreDispatcher.RunAsync, который принимает DispatchedHandler. DispatchedHandler имеет эту подпись:

public delegate void DispatchedHandler() 

Итак, когда вы проходите в async лямбда он будет в конечном итоге async void. Это делает невозможным await, так как нет никакой задачи. Это означает, что все после await в ваших lambdas будет работать на другой поток одновременно.

Вы не должны передавать делегата async этому методу.


Как примечание стороны, проходя CancellationToken не позволяет автоматически останавливать работу. Он может только остановить операцию до ее начала или если вы наблюдаете токен где-то внутри операции.

Таким образом, на самом деле использовать CancellationTokenDownload должен принимать использовать это, что делает Task.Run излишним:

await Download1Async(cts.Token); 
+0

Perfect..выводит смысл. Я изменю код соответствующим образом. Я обновил свой код выше; вы считаете, что использование отмены отменено неверно? Спасибо за вашу помощь! – AjS

+0

Комментарий Мэтта об этом довольно полный. – i3arnon

5

Можете ли вы просто называть их последовательно?

await Task.Run(async() => 
{ 
    await Download1(); 
    await Download2(); 
}); 

Вы можете даже не нужно Task.Run, если вы звоните из потока пользовательского интерфейса. Если вы уже на фоне потока, то попробуйте просто:

await Download1(); 
await Download2(); 

Конечно, ваш маркер отмены, вероятно, следует передать в функцию загрузки в любом случае.

+0

Я попробую. Я добавил событие, в котором я отменяю задачу; это неверно? Спасибо за вашу помощь! – AjS

+0

Вам все равно нужно передать CT в функцию загрузки и проверить 'IsCancellationRequested' и/или передать его в различные функции, которые вы вызываете. –

Смежные вопросы