首页 > 其他分享 >关于.net4.0使用WhenAny实现Task超时机制

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

时间:2023-06-25 17:45:54浏览次数:35  
标签:task return net4.0 WhenAny 任务 Task 超时

.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);

 

标签:task,return,net4.0,WhenAny,任务,Task,超时
From: https://www.cnblogs.com/xiaohemiao/p/17503559.html

相关文章

  • C#异步方法中Task.WhenAll的使用
    一、说明Task.WhenAll()、Task.WhenAny()这两个与Task.WaitALL()、Task.WaitAny()是有区别的,When是异步的,Wait是同步的。Task.WhenAll():所有task完成时,task才完成,用于等待多个任务执行结束。Task.WhenAny():任何一个task完成时,task完成。二、示例:usingSystem;usingSystem.IO......
  • taskkill
    问题taskkill/f/im程序名与taskkill/im程序名/f有什么区别呢......
  • Freertos学习01-Task Creat & Delete
    一、Freertos介绍FreeRTOS是一个开源的实时操作系统内核,它是由英国的RealTimeEngineersLtd.开发的。它提供了一些基本的内核功能,如任务管理、时间管理、信号量、队列和软件定时器等,可以帮助开发人员更容易地构建嵌入式系统。FreeRTOS是一个非常流行的实时操作系统内核,因为它是......
  • Android Application Task Activities的关系
    什么是Android Application?简单来说,一个apk文件就是一个Application。任何一个AndroidApplication基本上是由一些Activities组成,当用户与应用程序交互时其所包含的部分Activities具有紧密的逻辑关系,或者各自独立处理不同的响应。这些Activities捆绑在一起成为了一个处理特定需求......
  • ProgressDialog在 AsyncTaskTask 中的单独使用
    publicclassAsyncClassextendsAsyncTask<Void,String,Void>{privateContextcontext;ProgressDialogdialog;publicAsyncClass(Contextcxt){context=cxt;dialog=newProgressDialog(context);......
  • 数据库转移到sd卡AsyncTask,ProgressDialog使用
    privateclassExportDatabaseFileTaskextendsAsyncTask<String,Void,Boolean>{privatefinalProgressDialogdialog=newProgressDialog(ctx);//canuseUIthreadhereprotectedvoidonPreExecute(){this.di......
  • vs编译时打印Task中日志。
    https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-build-v|--verbositySetstheverbositylevelofthecommand.Allowedvaluesareq[uiet],m[inimal],n[ormal],d[etailed],anddiag[nostic].Thedefaultisminimal.Bydefault,MSBuilddisplay......
  • std::thread 五:打包任务(packaged_task)
     #include<iostream>#include<thread>#include<mutex>#include<list>#include<future>usingnamespacestd;intmyThread(intnum){cout<<"myThread()startthreadid="<<this_thread::get_i......
  • Task
    Thereisataskhere.Let'ssolveitnow.(19号截止)电动车保养(18号下午4点截止)买纸箱子(18号晚8点截止)收拾被子和衣服进蛇皮袋里面(19号晚8点截止)找货拉拉商量(18号截止)(18号截止)(18号截止)......
  • 【Linux中断】中断下半部-tasklet的原理与使用
    tasklet特性(1)一种特定类型的tasklet只能运行在一个CPU上,不能并行,只能串行执行(2)多个不同的类型的tasklet可以并行在多个CPU上(3)软中断是静态分配的,在内核编译好后,就不能再改变了。但tasklet灵活很多,可以在运行时改变tasklet是在两种软中断类型的基础上实现的,因此如果不需......