andcontinue() — метод, выполняемый как асинхронная операция

Для Windows Phone 8.1 Microsoft представила несколько методов, которые заканчиваются на AndContinue. Эти методы приостанавливают приложение для выполнения и обработки пользовательского ввода. После этого вызывают Continue...-метод с объектом, содержащим результат операции.

Примером может служить WebAuthenticationBroker.AuthenticateAndContinue, который используется для OAuth.

Пример кода:

class Test : IWebAuthenticationContinuable
{
    private void StartAuth()
    {
        WebAuthenticationBroker.AuthenticateAndContinue(new Uri("http://example.org/token?someInformations"),
                new Uri("http://example.org/callback"), null, WebAuthenticationOptions.None);
    }

    private void ContinueWebAuthentication(WebAuthenticationBrokerContinuationEventArgs args)
    {
        WebAuthenticationResult result = args.WebAuthenticationResult;

        //Do something with the result
    }
}

В приложениях для магазина Windows то же самое достигается с помощью WebAuthenticationBroker.AuthenticateAsync-emthod. Этот метод представляет собой простую асинхронную операцию.

Я хотел бы написать AuthenticateAsync-метод для Windows Phone, используя AuthenticateAndContinue. Он должен вернуть Task<WebAuthenticationResult>.

В качестве довольно хакерского подхода я подумал о Task, который завершается после выполнения ContinueWebAuthentication. Если я жду эту задачу и устанавливаю результат в какую-то переменную, я могу получить к нему доступ в асинхронном методе и вернуть его.

Но я не смог понять, как это реализовать.


person l.k.1234    schedule 12.05.2014    source источник


Ответы (1)


API-интерфейсы AndContinue не являются асинхронными вызовами, как AuthenticateAsync Магазина Windows. Из MSDN:

Когда вы вызываете метод AndContinue, ваше приложение деактивируется на время завершения операции для экономии памяти. На устройствах с малым объемом памяти ваше приложение может быть даже остановлено.

Таким образом, когда вы вызываете метод AndContinue, ваше приложение может быть завершено. Когда ваше приложение будет восстановлено, вам понадобится какой-то способ вернуться к методу async. Нет ничего подобного этому встроенному AFAIK.

Конечно, можно создать Task<WebAuthenticationResult> с помощью TaskCompletionSource<T>, но в данном случае это не сработает. Метод AndContinue может завершить работу вашего приложения, и когда ваше приложение возобновит работу, оно сможет завершить задачу, но не будет никаких ожидающих его методов async.

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

person Stephen Cleary    schedule 12.05.2014