Метод wait () задачи блокирует задачу - PullRequest
0 голосов
/ 22 мая 2018

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

    private static Task myTask;

    public static void sync(User user)
    {
        if (myTask== null || myTask.IsCompleted) {
            myTaskStarted = true;
            //Note: do not trust on the variable being filled in immediately after the start of the task. It takes a minute. Use the flag
            myTask= AsyncMyTask(user);
        }
    }

, а затем позже вызываю метод с другой страницы, который просто должен дождаться окончания выполнения myTask, вызывая myTask.Wait() последелать некоторые проверки на MyTask, который был запущен и не является нулевымНо я вижу, что как только я вызываю myTask.Wait(), myTask застревает и больше не прогрессирует в отладчике.Он застрял.Если я заменю myTask.Wait() на myTask.Wait(1000), myTask будет заморожен на время ожидания.После таймаута это продолжается.Это не то поведение, которое описано в документации.Может кто-нибудь объяснить, почему метод AsyncMyTask блокируется при вызове myTask.Wait () из потока пользовательского интерфейса?


В соответствии с запросом: метод AwaitMyTask:

    public async static Task<Boolean> AwaitMyTask()
    {
        if(!myTaskStarted && myTask== null)
        {
            return false;
        } else
        {
            while (myTask== null)
            {
                Task.Delay(10);
            }
        }
        //Stuck on the line below
        myTask.Wait();
        myTaskStarted = false;
        return myTask.IsCompleted;
    }

1 Ответ

0 голосов
/ 22 мая 2018

Task.Wait - синхронно ожидающая задача, которая блокирует поток.Если вы не можете указать на документацию с указанием чего-то другого, я бы сказал, что это ожидаемое поведение, как описано в https://msdn.microsoft.com/en-us/library/dd235635(v=vs.110).aspx

Wait - это метод синхронизации, который заставляет вызывающий поток ожидать текущую задачузавершено....

...