在一个函数中,同时执行2个或以上需要获取执行状态的Task,程序会假死掉,这应该属于Bug
当前环境信息如下:
VS2019
.net core3.1
代码如下:
var pInitTask = Task.Run(bindSelect); //初始化任务启动,不等待
var pLoadTask = loadListAsync(); //导入任务启动,也不等待
var pInitResult = pInitTask.GetAwaiter().GetResult(); //在这一步,要等到初始化彻底完成,否则显示数据会错误
if (pInitResult.mResult == EMSuccessFail.resultFail) {
return pInitResult;
}
onHelpInfo("初始化完成,开始启动");
var pLoadResult = pLoadTask.GetAwaiter().GetResult(); //在这一步,等到导入任务完成,但实际上会死掉,失去响应
if (pLoadResult.mResult == EMSuccessFail.resultSuccess) {
执行数据显示
}
改成如下,则可以成功运行,但代码运行效率将降低,等待时间将变长
var pInitTask = Task.Run(bindSelect); //初始化任务启动,不等待
var pLoadResult =await loadListAsync(); //导入任务启动,等待到导入完成
var pInitResult = pInitTask.GetAwaiter().GetResult(); //在这一步,要等到初始化彻底完成,否则显示数据会错误
if (pInitResult.mResult == EMSuccessFail.resultFail) {
return pInitResult;
}
onHelpInfo("初始化完成,开始启动");
if (pLoadResult.mResult == EMSuccessFail.resultSuccess) {
执行数据显示
}
碰到了,做个记录,暂时只能设定为NetCore3.1的BUG,以后在Net6下面,再尝试一下同时启动2个监测Task
如果多个Task只需要调用执行,而不需要监测执行状态,则不会有问题
如同时执行多个
Task.run(fun1);
Task.run(fun2);
Task.run(fun3);
补充:
此情况应该不是普遍情况,后面才注意到bindSelect方法本身也包含了2个Task监测的情况,但执行是正常的
private SuccessFailResult bindSelect() {
xGridViewClass.Enabled = false; //导入完整前,不能启用
xGridViewPlayer.Enabled = false;
var pBind1 = bindCmsClassSelect();
var pBind2 = bindCmsPlayerSelect();
return SuccessFailResult.filtrateFail(pBind1.GetAwaiter().GetResult(), pBind2.GetAwaiter().GetResult());
}
说明,是当这个Task监测嵌套时,才会出现假死的情况