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

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;
            }
        }
    }
}
posted @ 2023-10-30 13:47  少年。  阅读(31)  评论(0编辑  收藏  举报