net core 异步超时取消机制

方法一:

利用Task.WhenAny
复制代码
namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
            CancellationTokenSource cts = new CancellationTokenSource();

            Task taskMethod1 = Method1(cts.Token);
            Task taskComplete = Task.WhenAny(taskMethod1, Task.Delay(100, cts.Token));

            if (taskComplete != taskMethod1) //超时
            {
                cts.Cancel();
            }

            Console.WriteLine("end");

            Console.ReadLine();

        }

        public static async Task Method1(CancellationToken token)
        {
            Console.WriteLine("Method1 start");
            await Task.Delay(1000, token);
            Console.WriteLine("Method1 end");
        }
        public static async Task Method2(CancellationToken token)
        {
            await Task.Delay(2000, token);
            Console.WriteLine("Method2");
        }

    }
}
复制代码

方法二:

.WaitAsync
复制代码
namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");

            Demo();

            Console.WriteLine("end");

            Console.ReadLine();

        }
        public static async Task Demo()
        {
            CancellationTokenSource cts = new CancellationTokenSource();

            try
            {
                await Method2(cts.Token).WaitAsync(TimeSpan.FromSeconds(1));
            }
            catch (Exception ex)
            {
                Console.WriteLine("timeout");
                cts.Cancel();

            }
        }

        public static async Task Method1(CancellationToken token)
        {
            Console.WriteLine("Method1 start");
            await Task.Delay(1000, token);
            Console.WriteLine("Method1 end");
        }
        public static async Task Method2(CancellationToken token)
        {
            try
            {
                await Task.Delay(5000, token);
                Console.WriteLine("Method2");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"{ex.Message}");
            }

        }
        public static async Task Method3()
        {
            await Task.Delay(2000);
            Console.WriteLine("Method2");
        }
    }
}
复制代码

 

 

posted @   竹林听雨行  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示