В примерах кода используется Xamarin Android.
Я расширяю IntentService
. У него мало методов жизненного цикла. В частности, void OnHandleIntent(Intent intent)
, где вы выполняете реальную работу, и void OnDestroy()
, который вызывается системой, когда она видит, что служба закончила работу, и пришло время ее уничтожить. Для IntentService
конец его жизни - это когда OnHandleIntent
возвращается.
Будучи методом, подобным событию, можно использовать async void OnHandleIntent
. Рассмотрим следующий код
protected override async void OnHandleIntent(Intent intent)
{
Debug.Out("OnHandleIntent Start");
await Task.Run(async () => await Task.Delay(1000));
Debug.Out("OnHandleIntent End");
}
protected override void OnDestroy(Intent intent)
{
base.OnDestroy();
Debug.Out("OnDestroy");
}
Вывод:
Debug.Out("OnHandleIntent Start");
Debug.Out("OnDestroy");
Debug.Out("OnHandleIntent End");
В то же время следующий (блокирующий) код работает как положено
protected override void OnHandleIntent(Intent intent)
{
Debug.Out("OnHandleIntent Start");
Task.Run(async () => await Task.Delay(1000)).Wait();
Debug.Out("OnHandleIntent End");
}
protected override void OnDestroy(Intent intent)
{
base.OnDestroy();
Debug.Out("OnDestroy");
}
Вывод:
Debug.Out("OnHandleIntent Start");
Debug.Out("OnHandleIntent End");
Debug.Out("OnDestroy");
Вопрос - почему это происходит?