C# Task不执行的原因

C#线程使用Task来替代Thread,但是在项目中却遇到用户反馈某些功能不执行。

可能的原因有:

一、系统CPU、内存使用率已经接近饱和

将代码由原本的:

 Task.Factory.StartNew(() =>{});

修改为:

 Task.Factory.StartNew(() =>{}, TaskCreationOptions.LongRunning); 使用独立线程,不被线程池控制,否则可能资源不足线程池不排档期。

 

二、电脑自动休眠

电脑休眠后,线程不再执行。

解决方法:让用户禁止电脑休眠,或者在软件启动时用代码控制电脑不休眠。

[DllImport("kernel32.dll")]
public static extern uint SetThreadExecutionState(uint esFlags);
public const uint ES_AWAYMODE_REQUIRED = 0x00000040;
public const uint ES_CONTINUOUS = 0x80000000;
public const uint ES_DISPLAY_REQUIRED = 0x00000002;
public const uint ES_SYSTEM_REQUIRED = 0x00000001;

/// <summary>
/// 阻止系统睡眠
/// </summary>
public static void StopSystemSleep()
{
    SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED);
}

/// <summary>
 /// 恢复系统睡眠设置
/// </summary>
public static void RestoreSystemSleep()
{
    SetThreadExecutionState(ES_CONTINUOUS);
}

三、Task中代码异常

Task中的代码异常会导致线程退出,自然就不会继续执行其中的代码。

建议将Task内执行代码用try-catch捕获异常,这样能及时发现问题。

如果已经添加了try-catch,还是不执行,那么可能是因为Task中调用了外部组件的方法,外部组件抛出异常是无法被try-catch捕获到的,也就导致Task也退出。

解决方法是在Task中嵌套一个子Task等待其执行完成,这样就算子Task异常退出了,主Task还存活。

代码如下:

 Task.Factory.StartNew(() =>
    {
        var subTask = Task.Run(()=>
        {
            //这里写可能退出线程的代码
        });
        subTask.Wait();
    }, 
    TaskCreationOptions.LongRunning); 

四、更多原因,持续更新中……(欢迎评论区提供原因,一起完善本文档)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清缓

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值