首页 > 解决方案 > async Task 和 async void 的执行是否相同

问题描述

代码示例将使用 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");

问题是——为什么会发生?

标签: c#xamarin.androidasync-await

解决方案


async void调用者不能等待方法(因为没有返回等待等待的任务)。

第一个实现将在Delay完成之前返回;它将被执行为 fire and forget 操作。


顺便提一句。

await Task.Run(async () => await Task.Delay(1000))

await Task.Delay(1000))

推荐阅读