等待线程的两种方法,方法执行超时设置超时时间

本文比较了两种常见的线程等待方法:Task.Wait(适用于简单方法但可能导致UI卡顿)和Task.WhenAny(返回最早完成的任务,避免阻塞UI)。作者强调了在UI线程中使用异步编程的重要性以提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

方法1:线程等待常用方法是TASK.Wait()。加上参数就可以设置超时时间,如:

var q = Task.Run(() =>
{
    //方法体
});
if (q.Wait(1000))//一秒返回
{

}
else//一秒未返回
{

}

该方法适合毫秒级超时时间,且业务简单的方法,因为其会阻塞主线程,不建议用在UI线程下,会造成界面卡顿,影响用户体验。并且,超时后的线程会继续执行,直到执行完成或崩溃或锁死(未验证)。

方法2:利用Task.WhenAny()方法。其只会返回最早执行结束的线程。例如:

public async Task Test()
{

//实例化一个取消方法标记

using (var timeoutCancellationTokenSource = new CancellationTokenSource())
{
    var timeouttask = Task.Delay(40000); //创建一个等待线程并设置超时时间
    var t = Task.Run(() =>
    {  
           //方法体
     }, timeoutCancellationTokenSource.Token);//给个方法取消标记防止超时后继续执行
    var completedTask = await Task.WhenAny(t, timeouttask);
    if (completedTask == timeouttask)//超时了,返回的是超时时间线程
    {
        timeoutCancellationTokenSource.Cancel();   //超时了取消继续执行   
    }
    else
    {
      // 未超时执行代码
    }
}

}

使用:

private async void UseIt()

{

await Test();//用await不会阻塞UI线程。
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

曾弟弟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值