posts - 52,comments - 30,views - 13万
     [HttpGet]
        public async Task<string> TestUU()
        {
            ParentTsk().Wait();
            Console.WriteLine("Hello World!");
            return "ok";
        }
复制代码
     public async static Task ParentTsk()
        {
            CancellationTokenSource cts = new CancellationTokenSource();
            cts.CancelAfter(20);
            Task<string> workTsk = Task.Run(async () => await WorkTsk());
            Task<string> watchTsk = Task.Run(async () => await WatchTsk(cts.Token));
            Task<string>[] tskArray = new Task<string>[] { watchTsk, workTsk };

            var rsltTsk = await Task.WhenAny(tskArray);
            Console.WriteLine($"执行结果{rsltTsk.Result}");

        }
复制代码
复制代码
     public async static Task<string> WorkTsk()
        {

            string fileName = @"d:\tstFile.txt";
            List<int> lstINt = Enumerable.Range(0, 5000).ToList();
            foreach (var item in lstINt)
            {
                await System.IO.File.AppendAllTextAsync(fileName, $"{item}|");
            }

            return "it is WorkTsk";
        }

        public async static Task<string> WatchTsk(CancellationToken token)
        {
            while (!token.IsCancellationRequested)
            {
                await Task.Delay(10);
            }
            return "it is WatchTsk";
        }
复制代码

方案二

复制代码
using System;
using System.Threading;

class Program
{
    static ManualResetEvent mreA = new ManualResetEvent(false);
    static ManualResetEvent mreB = new ManualResetEvent(false);

    static void Main()
    {
        Thread threadA = new Thread(MethodA);
        Thread threadB = new Thread(MethodB);

        threadA.Start();
        threadB.Start();

        // 等待任一线程完成
        WaitHandle.WaitAny(new WaitHandle[] { mreA, mreB });

        // 如果线程 A 先完成,则中断线程 B
        if (mreA.WaitOne(0))
        {
            threadB.Interrupt();
        }
        // 如果线程 B 先完成,则中断线程 A
        else if (mreB.WaitOne(0))
        {
            threadA.Interrupt();
        }
    }

    static void MethodA()
    {
        try
        {
            Console.WriteLine("MethodA 开始执行");
            // 模拟 MethodA 的执行时间
            Thread.Sleep(3000);
            Console.WriteLine("MethodA 执行完成");
            mreA.Set(); // 通知主线程线程 A 已完成
        }
        catch (ThreadInterruptedException)
        {
            Console.WriteLine("MethodA 被中断");
        }
    }

    static void MethodB()
    {
        try
        {
            Console.WriteLine("MethodB 开始执行");
            // 模拟 MethodB 的执行时间
            Thread.Sleep(2000);
            Console.WriteLine("MethodB 执行完成");
            mreB.Set(); // 通知主线程线程 B 已完成
        }
        catch (ThreadInterruptedException)
        {
            Console.WriteLine("MethodB 被中断");
        }
    }
}
复制代码

 方案三

复制代码
using System;
using System.Threading;

class Program
{
    static CancellationTokenSource ctsA = new CancellationTokenSource();
    static CancellationTokenSource ctsB = new CancellationTokenSource();

    static void Main()
    {
        Thread threadA = new Thread(() => MethodA(ctsA.Token));
        Thread threadB = new Thread(() => MethodB(ctsB.Token));

        threadA.Start();
        threadB.Start();

        while (true)
        {
            // 检查线程A是否完成
            if (threadA.ThreadState == ThreadState.Stopped)
            {
                Console.WriteLine("线程A先执行完毕,取消线程B");
                ctsB.Cancel();
                break;
            }
            // 检查线程B是否完成
            else if (threadB.ThreadState == ThreadState.Stopped)
            {
                Console.WriteLine("线程B先执行完毕,取消线程A");
                ctsA.Cancel();
                break;
            }
        }
    }

    static void MethodA(CancellationToken token)
    {
        try
        {
            Console.WriteLine("线程A开始执行");
            // 模拟 MethodA 的执行时间
            Thread.Sleep(3000);
            Console.WriteLine("线程A执行完成");
        }
        catch (ThreadInterruptedException)
        {
            Console.WriteLine("线程A被中断");
        }
    }

    static void MethodB(CancellationToken token)
    {
        try
        {
            Console.WriteLine("线程B开始执行");
            // 模拟 MethodB 的执行时间
            Thread.Sleep(2000);
            Console.WriteLine("线程B执行完成");
        }
        catch (ThreadInterruptedException)
        {
            Console.WriteLine("线程B被中断");
        }
    }
}
复制代码

方案四

复制代码
using System;
using System.Threading;

class Program
{
    static ManualResetEventSlim threadACompleted = new ManualResetEventSlim(false);
    static ManualResetEventSlim threadBCompleted = new ManualResetEventSlim(false);

    static void Main()
    {
        Thread threadA = new Thread(MethodA);
        Thread threadB = new Thread(MethodB);

        threadA.Start();
        threadB.Start();

        // 等待任一线程完成
        WaitHandle.WaitAny(new WaitHandle[] { threadACompleted.WaitHandle, threadBCompleted.WaitHandle });

        // 如果线程 A 先完成,则中断线程 B
        if (threadACompleted.IsSet)
        {
            threadB.Interrupt();
        }
        // 如果线程 B 先完成,则中断线程 A
        else if (threadBCompleted.IsSet)
        {
            threadA.Interrupt();
        }
    }

    static void MethodA()
    {
        try
        {
            Console.WriteLine("线程A开始执行");
            // 模拟 MethodA 的执行时间
            Thread.Sleep(3000);
            Console.WriteLine("线程A执行完成");
            threadACompleted.Set(); // 通知主线程线程 A 已完成
        }
        catch (ThreadInterruptedException)
        {
            Console.WriteLine("线程A被中断");
        }
    }

    static void MethodB()
    {
        try
        {
            Console.WriteLine("线程B开始执行");
            // 模拟 MethodB 的执行时间
            Thread.Sleep(2000);
            Console.WriteLine("线程B执行完成");
            threadBCompleted.Set(); // 通知主线程线程 B 已完成
        }
        catch (ThreadInterruptedException)
        {
            Console.WriteLine("线程B被中断");
        }
    }
}
复制代码

 

posted on   白码一号  阅读(260)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示