蜡笔小欣丫 2024-05-16 09:25 采纳率: 0%
浏览 8

VS中线程没等待程序执行完毕直接退出

我在VS中新建了两个线程ThreadTask1()和ThreadTask2(),我在运行的时候,执行线程1还没等我的程序执行完毕,该线程就直接退出了,如何使得我的线程持续到我的程序执行完毕后再退出?

 private void ThreadTask1()
        {
            readHelp(filePath); //执行程序
        }

        

        private void ThreadTask2()
        {
            ReadExcel(filePath);
        }

        private void btn_ReadExcel_Click(object sender, EventArgs e)
        {
            Thread trd1 = new Thread(new ThreadStart(this.ThreadTask1));
            Thread trd2 = new Thread(new ThreadStart(this.ThreadTask2));

            
            CheckForIllegalCrossThreadCalls = false;

            if (method == 1)
            {
                OpenFileDialog file = new OpenFileDialog();
                // file.ShowDialog();//会重复弹窗——删
                if (file.ShowDialog() == DialogResult.OK)
                {
                    filePath = file.FileName;
                    trd1.Start();
                }
            }

            if(method == 0)
               {
                OpenFileDialog file = new OpenFileDialog();
                if (file.ShowDialog() == DialogResult.OK)
                {
                    filePath = file.FileName;
                    trd2.Start();
                }
                
               }

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-05-16 09:25
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您想要解决的问题

    您提问的目的是解决在Visual Studio(VS)中创建的两个线程ThreadTask1()ThreadTask2()在程序执行完毕之前就退出的问题。您希望线程能够持续运行直到程序的所有任务都完成。

    问题出现原因

    根据您提供的代码,问题可能出现在以下几个方面:

    1. 线程启动后没有等待:您通过trd1.Start();trd2.Start();启动了线程,但没有等待线程完成就可能继续执行了其他代码。
    2. 主线程退出导致子线程终止:如果主线程执行完毕,而子线程还在运行,程序可能会在主线程退出时强制结束所有子线程。
    3. 缺少线程同步机制:没有使用任何线程同步机制,如Thread.Join()ManualResetEvent,来确保主线程等待子线程完成。

    问题解决方案

    为了确保线程执行完毕,您可以使用以下几种方法之一:

    1. 使用Thread.Join():在启动线程后,调用Join()方法,这将使主线程等待直到子线程完成。

    2. 使用ManualResetEvent:创建一个ManualResetEvent对象,并在线程任务完成后设置该事件。主线程等待该事件被设置。

    提供代码

    以下是使用Thread.Join()方法修改后的代码示例:

    private void btn_ReadExcel_Click(object sender, EventArgs e)
    {
        Thread trd1 = new Thread(new ThreadStart(this.ThreadTask1));
        Thread trd2 = new Thread(new ThreadStart(this.ThreadTask2));
    
        CheckForIllegalCrossThreadCalls = false;
    
        if (method == 1)
        {
            OpenFileDialog file = new OpenFileDialog();
            if (file.ShowDialog() == DialogResult.OK)
            {
                filePath = file.FileName;
                trd1.Start();
                trd1.Join(); // 等待 trd1 线程完成
            }
        }
    
        if (method == 0)
        {
            OpenFileDialog file = new OpenFileDialog();
            if (file.ShowDialog() == DialogResult.OK)
            {
                filePath = file.FileName;
                trd2.Start();
                trd2.Join(); // 等待 trd2 线程完成
            }
        }
    }
    

    代码运行方式

    • 您需要在Visual Studio环境中运行这段代码。
    • 确保您的项目已经设置了正确的线程启动和同步机制。

    代码预期运行结果

    使用Thread.Join()后,主线程会在启动的子线程完成之前等待,从而确保程序不会在子线程任务执行完毕之前退出。

    推荐相关链接

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月16日

悬赏问题

  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真
  • ¥15 关于#c语言#的问题,请各位专家解答!