方法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线程。
}