关于.net4.0使用WhenAny实现Task超时机制

发布时间 2023-06-25 17:42:14作者: 1000374

.net4.0想要使用await/async语法糖必须要引用:

  • Microsoft.Bcl
  • Microsoft.Bcl.Async 
  • Microsoft.Bcl.Build

可以从nuget引用此三个包

public static async Task<TResult> TryRunWithTimeoutAsync<TResult>(this Func<TResult> function, int dueTime)
        {
            //用于取消任务
            using (CancellationTokenSource timeoutCancellationTokenSource = new CancellationTokenSource())
            {
                Thread thread = null;
                Func<TResult> action = delegate ()
                {
                    thread = Thread.CurrentThread;
                    return function();
                };
 
                var task = TaskEx.Run(action);
                //WhenAny 等待所有任务结束,这里加入了超时时间
                //ConfigureAwait 配置用来等待 任务1的警报,返回值可以获取到改任务
                Task completedTask = await TaskEx.WhenAny(task, TaskEx.Delay(dueTime, timeoutCancellationTokenSource.Token)).ConfigureAwait(continueOnCapturedContext: false);
 
                //如果当前任务完成了,并且匹配
                if (completedTask == task)
                {
                    //取消任务
                    timeoutCancellationTokenSource.Cancel();
 
                    //得到任务返回结果
                    return await task;
                }
                else //任务超时
                {
                    try
                    {
                        thread?.Abort();
                    }
                    catch { }
                    return default;
                }
            }
        }

调用:

Func<string> fun =
               delegate
               {
                   return function(para1,para2..);
               };
            return fun.TryRunWithTimeoutAsync(10000);