Невозможно вызвать Task.Run() в backgroundTask

Я хочу что-то сделать в потоке в фоновой задаче, поэтому я попытался использовать Task.Run(), но это не сработало.

Любой может показать мне другой способ создания потока в фоновой задаче.

Это мой код:

   public sealed class KatzBackgroundTask : IBackgroundTask
   {

    public void Run(IBackgroundTaskInstance taskInstance)
    {
        RawNotification notification = (RawNotification)taskInstance.TriggerDetails;
        string content = notification.Content;
        System.Diagnostics.Debug.WriteLine(content);
        testLoop();
    }

    async void testLoop()
    {
        await Task.Run(() =>
       {
           int myCounter = 0;
           for (int i = 0; i < 100; i++)
           {
               myCounter++;
                //String str = String.Format(": {0}", myCounter);
                Debug.WriteLine("testLoop runtimeComponent : " + myCounter);
           }
       }
       );

    }
}

Когда я удаляю await Task.Run(), цикл for может работать нормально, но когда я его не удаляю, цикл for не может работать.


person ThangBM    schedule 28.06.2016    source источник
comment
Вы никогда не должны делать async void, если только вы не пишете обработчик событий   -  person Scott Chamberlain    schedule 28.06.2016


Ответы (1)


Чтобы запускать задачи или использовать шаблон await - async в фоновых задачах, вам необходимо использовать отсрочки, иначе ваша задача может неожиданно завершиться, когда она достигнет конца метода Run.

Подробнее читайте в официальной документации здесь

Вот как вы могли бы реализовать отсрочку задачи в своем коде:

public sealed class KatzBackgroundTask : IBackgroundTask
{
    BackgroundTaskDeferral _deferral = taskInstance.GetDeferral(); 
    public async void Run(IBackgroundTaskInstance taskInstance)
    {
        RawNotification notification = (RawNotification)taskInstance.TriggerDetails;
        string content = notification.Content;
        System.Diagnostics.Debug.WriteLine(content);
        await testLoop();
        _deferral.Complete();
    }

    async Task testLoop()
    {
        await Task.Run(() =>
        {
           int myCounter = 0;
           for (int i = 0; i < 100; i++)
           {
               myCounter++;
               //String str = String.Format(": {0}", myCounter);
              Debug.WriteLine("testLoop runtimeComponent : " + myCounter);
           }
       }
   )

}
person AlexDrenea    schedule 28.06.2016
comment
Вам также нужно исправить эти async void, прямо сейчас await testLoop(); не будет компилироваться. - person Scott Chamberlain; 28.06.2016
comment
Он все равно не скомпилируется, потому что testLoop возвращает void вместо Task - person Scott Chamberlain; 28.06.2016
comment
Черт, вот что происходит, когда вы отвечаете, не имея доступа к вашей машине разработки. - person AlexDrenea; 28.06.2016