c# - 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");
问题是——为什么会发生?
解决方案
async void
调用者不能等待方法(因为没有返回等待等待的任务)。
第一个实现将在Delay
完成之前返回;它将被执行为 fire and forget 操作。
顺便提一句。
await Task.Run(async () => await Task.Delay(1000))
可
await Task.Delay(1000))
推荐阅读
- list - 如何在一列中打印值列表?
- ios - pdf 创建后 UIGraphicsBeginPDFContextToData 不显示图像
- git - 如何添加未跟踪的文件以在 git 中提交?
- r - 如果列是不寻常的类型,我如何检查它的类型?
- swift - 为什么我的应用程序在启动时由于 ibShadowedLargeTitleTextAttributes 错误而崩溃?
- android - 在 android:onClick 属性的父或祖先上下文中找不到方法 share(View)
- r - R 等效于 endsWith 来检查字符串列表
- linux - 是否可以在自己的程序中使用 BPF 作为库?
- anaconda - 防止anaconda在没有激活virtual-env时添加`(base)`进行提示(即virtual-env = anaconda base)
- asp.net - 在 Timer 刻度处显示(标签控件)内部(中继器控件)