关闭
1195116234 2023-10-07 10:36 采纳率: 33.3%
浏览 12

C#线程异步问题,中止正在运行的循环

C#的开发,目前遇到一个C#的需求
先调用开始方法,这个方法要先调用一个很长的循环,会造成UI阻塞,这个循环执行完了才能执行后面的代码,获取到结果数据
现在要增加一个Stop方法可以随时调用,随时中止这个循环的执行,我尝试把循环放到线程,但是后面拿结果的代码就没法处理了
怎么实现可以非阻塞等待一个线程执行完循环,还可以随时调用另外的Stop方法中止这个循环的运行,谢谢了

  • 写回答

4条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-07 12:08
    关注

    【相关推荐】



    • 你可以看下这个问题的回答https://ask.csdn.net/questions/714680
    • 除此之外, 这篇博客: 【收藏】❤️❤️❤️50道经典c#程序面试题——机试篇中的 34.编一个程序,用while循环语句实现下列功能:有一篮鸡蛋,不止一个,有人两个两个数,多余一个,三个三个数,多余一个,再四个四个地数,也多余一个,请问这篮鸡蛋至少有多少个。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
      int num=2;
      while(num<10000)
      {
      if (num % 2 == 1 && num % 3 == 1 && num % 4 == 1)
      {
      Console.Write("这篮鸡蛋至少有{0}个", num);
      break;
      }
      num++;
      

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论
  • 压力桶 2023-10-08 08:01
    关注

    线程中有一个CancellationTokenSource,这个取消Task线程任务。
    可以在全局定义一个变量a,定以一个stop的方法或者修改其他方式修改这个a,在循环方法内部监听这个a,如果状态变更可以传入CancellationTokenSource 取消线程。
    定义一个 flag用来监听,状态变更的时候 cts.Cancel();

    /// <summary>
    /// 测试任务
    /// </summary>
    public static void TestTask()
    {
        Console.WriteLine("程序开始.");
        CancellationTokenSource cts = new CancellationTokenSource();
        CancellationToken token = cts.Token;
        var task = Task.Run(() =>
        {
            while (!token.IsCancellationRequested)
            {
                Console.WriteLine(正在运行...");
                Thread.Sleep(300);
            }
        });
        Console.WriteLine("程序超时结束.");
    }
    
    
    评论 编辑记录
  • 我可是森森呢 2023-10-09 06:15
    关注

    把核心方法写成异步,UI界面绝对不能阻塞。不过想要用户不操作其他的,可以把其他控件给Enabled = false;只留个停止按钮

    评论
  • 监狱和高墙 2023-10-09 07:04
    关注

    要实现在一个线程执行循环的同时,能够随时中止该循环的运行,可以使用C#的多线程编程和线程控制机制。您可以使用CancellationToken来实现这个目标。以下是一个示例代码

    using System;
    using System.Threading;
    using System.Threading.Tasks;
    
    class Program
    {
        private static CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    
        static void Main()
        {
            Console.WriteLine("Press Enter to start the loop.");
            Console.ReadLine();
    
            // 启动一个新线程来执行循环
            Task.Run(() => LongRunningLoop(cancellationTokenSource.Token));
    
            // 当用户按下 Enter 键时,停止循环
            Console.WriteLine("Press Enter to stop the loop.");
            Console.ReadLine();
            cancellationTokenSource.Cancel();
    
            Console.WriteLine("Loop stopped. Press Enter to exit.");
            Console.ReadLine();
        }
    
        static void LongRunningLoop(CancellationToken cancellationToken)
        {
            try
            {
                while (!cancellationToken.IsCancellationRequested)
                {
                    // 执行循环的工作,这里可以是耗时的操作
                    Console.WriteLine("Working in the loop...");
    
                    // 模拟耗时操作
                    Thread.Sleep(1000);
                }
            }
            catch (OperationCanceledException)
            {
                Console.WriteLine("Loop canceled.");
            }
        }
    }
    
    
    

    在此示例中,我们使用CancellationTokenSource和CancellationToken来控制循环的运行。当用户按下 Enter 键时,cancellationTokenSource.Cancel()被调用,从而触发OperationCanceledException,并退出循环。

    展开全部

    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部