首页 > 编程语言 >c#使用委托执行带有超时检查的方法

c#使用委托执行带有超时检查的方法

时间:2023-10-30 13:55:53浏览次数:34  
标签:Execute 委托 c# static result Test 超时 方法

namespace TimeOutHelper
{
    internal class Program
    {
        // 定义一个泛型委托,用于定义带有超时检查的方法的签名
        public delegate TR TimeOutDelegate<in T, out TR>(T param);

        private static void Main()
        {
            Dictionary<Guid, string> result;
            
            // 调用TimeoutFunction类的Execute方法执行带有超时检查的方法
            // Test方法是一个示例方法,它接受一个字符串参数,并返回一个字典
            // "Hello, World!"是传递给Test方法的参数
            // result是用于接收Test方法的返回值的字典
            // TimeSpan.FromSeconds(3)表示超时时间为3秒
            // Execute方法返回一个布尔值,表示是否超时
            Console.WriteLine(TimeoutFunction.Execute(Test, "Hello, World!", out result, TimeSpan.FromSeconds(3)));
            
            Console.WriteLine("Hello, World!");
            Console.ReadKey();
        }

        // 示例方法,接受一个字符串参数,并返回一个字典
        public static Dictionary<Guid, string> Test(string sourceString)
        {
            // 将字符串转换为字典,每个字符作为键,使用Guid作为值
            var result = sourceString.ToDictionary(
                character => Guid.NewGuid(),
                character => character.ToString(CultureInfo.InvariantCulture));
            
            // 模拟耗时操作,暂停4秒
            Thread.Sleep(4000);
            
            return result;
        }

        public static class TimeoutFunction
        {
            /// <summary>
            /// 执行带有超时检查的方法
            /// </summary>
            /// <typeparam name="T">目标方法的参数类型</typeparam>
            /// <typeparam name="TR">执行结果的类型</typeparam>
            /// <param name="timeoutMethod">目标方法</param>
            /// <param name="param">目标方法的参数</param>
            /// <param name="result">执行结果</param>
            /// <param name="timeout">超时时间</param>
            /// <returns>是否超时</returns>
            public static Boolean Execute<T, TR>(
                TimeOutDelegate<T, TR> timeoutMethod, T param, out TR result, TimeSpan timeout)
            {
                // 使用异步方式执行目标方法
                var asyncResult = timeoutMethod.BeginInvoke(param, null, null);
                
                // 等待指定的超时时间
                if (!asyncResult.AsyncWaitHandle.WaitOne(timeout, false))
                {
                    // 如果超时,则将结果设置为默认值,并返回true
                    result = default(TR);
                    return true;
                }
                
                // 如果未超时,则获取执行结果,并返回false
                result = timeoutMethod.EndInvoke(asyncResult);
                return false;
            }
        }
    }
}

标签:Execute,委托,c#,static,result,Test,超时,方法
From: https://www.cnblogs.com/ouyangkai/p/17797664.html

相关文章

  • redis 替换keys方案 scan
    redis替换keys方案@AutowiredprivateRedisTemplateredisTemplate;publicSet<String>keyScan(Stringkey){//批量查询需要统计的数据Set<String>keys=(Set<String>)redisTemplate.execute((RedisCallback<Set<String>>)connec......
  • 机器狗装上 ChatGPT 大脑当导游;AI 正在学习「超人的说服力」丨 RTE 开发者日报 Vol.73
     开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE (RealTimeEngagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,......
  • keycloak~为keycloak-services项目添加第三方模块(首创)
    我们在对keycloak框架中的核心项目keycloak-services进行二次开发过程中,发现了一个问题,当时有这种需求,在keycloak-services中需要使用infinispan缓存,我们直接添加infinispan-core引用之后,在启动keycloak进出错了,提示我们没有找到infinispan.Cache,于是我尝试了如下方法,最终解决了问......
  • [WEB安全] CSRF攻击和防御
    一、什么是CSRF  跨站请求伪造(英语:Cross-siterequestforgery),也被称为 one-clickattack 或者 sessionriding,通常缩写为 CSRF 或者 XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。 跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的......
  • TypeScript入门到精通——TypeScript类型系统基础——类型别名
    类型别名 如同接口声明能够为对象类型命名,类型别名声明能够为TypeScript中的任意类型命名。一、类型别名声明 类型别名声明能够定义一个类型别名,它的基本语法如下所示:typeAliasName=Type 在该语法中,type是声明类型别名的关键字;AliasName表示类型别名的名称;Ty......
  • fastapi websockets
    #pipinstallwebsocketsfromuvicornimportrunfromfastapiimportFastAPIapp=FastAPI(title="websocket")fromtypingimportListfromfastapiimportFastAPI,WebSocket,WebSocketDisconnectfromfastapi.responsesimportHTMLResponseht......
  • 无涯教程-C语言 - 储存类
    我们在C程序中有四种不同的存储类-autoregisterstaticexternautoauto存储类是所有局部变量的默认存储类。{intmount;autointmonth;}上面的示例在同一存储类中定义了两个变量,"auto"只能在函数(即局部变量)中使用。register寄存器存储类用于定义应存储在......
  • C++U5-深度优先搜索-03(记忆化搜索、剪枝和优化)
    ......
  • echart 折线图
       option={"title":[{"textAlign":"center","text":"linear","textStyle":{"fontSize":12,......
  • 02Collection的遍历方式
    Collection的遍历方式遍历器遍历增强for循环遍历Lambda表达式遍历普通for只有List系列的才能用,Set用不了一、迭代器遍历iteratorn.迭代器,迭代程序。迭代器不依赖索引。迭代器遍历就是把元素一个一个的获取出来二、迭代器的Iterator类,和它的常用方法迭代器......