异步任务的执行和异步无效是否相同

时间:2019-10-10 11:23:36

标签: c# xamarin.android async-await

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

问题是-为什么会发生?

1 个答案:

答案 0 :(得分:1)

呼叫者无法等待

async void方法(因为没有等待任务返回)。

第一个实现将在Delay完成之前返回;它会被当作即发即弃操作执行。


顺便说一句。

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

可以

await Task.Delay(1000))