c#使用委托执行带有超时检查的方法
  PIGub5wnqDVH 2023年11月02日 46 0
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;
            }
        }
    }
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
PIGub5wnqDVH