代码示例将使用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");
问题是-为什么会发生?
答案 0 :(得分:1)
async void
方法(因为没有等待任务返回)。
第一个实现将在Delay
完成之前返回;它会被当作即发即弃操作执行。
顺便说一句。
await Task.Run(async () => await Task.Delay(1000))
可以
await Task.Delay(1000))