DotNet / 编程技术 · 2022年9月27日

在一个函数中,同时执行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监测嵌套时,才会出现假死的情况

最新电影,电视剧,尽在午夜剧场

电影电视剧午夜不寂寞