当前位置:编程学习 > C#/ASP.NET >>

多线程 画面假死 判断线程是否已经结束

         *
         * 关于多线程与画面假死与判断线程是否已经结束
         * 1.假设在数据查询或者更新时(bnt_Click)。花费比较长的时间。会假死。所以我另开线程(Search_Thread)
         * 2.那如何在父线程(bnt_Click)如何知道。子线程(Search_Thread)已经结束了呢。如 我想在查询完或者更新完(Search_Thread结束)后。报个Msg
         *  2.1
         *      当然在只有一个线程时。我只可以在该子线程结束后加入事件来报我的Msg
         *   2.2
         *     但假设我有很多线程(>10)时。我不可能在每个线程里。加事件。吧
         *   2.3
         *    所以我想能不能。 做到让父线程 捕获 所有子线程已经结束了。然后。再执行下面报Msg 
         *   2.4
         *     用Thread.join的话可等待。但这样父线程(bnt_Click)就会假死
         * 3. 所以想请问下。我哪里理解错了。或者有什么好方法。谢谢了
         * --------------------编程问答-------------------- 申明为后台线程就不会假死了。 --------------------编程问答-------------------- 1. 在你的线程方法中,return 前去加个标志
2. 不想再每个方法后面加,就创建一个基类

通过判断线程状态来获得线程方法的状态是个极度不靠谱的方法。 --------------------编程问答-------------------- 给你一个例子,自己去扩展.

 static void Main(string[] args)
        {
            //定义同步事件
            AutoResetEvent[] events = 
            {
                new AutoResetEvent(false),
                new AutoResetEvent(false),
                new AutoResetEvent(false),
                new AutoResetEvent(false)
            };

            Action notify = delegate
            {
               //通知,等待全部完成才输出信息
                if (WaitHandle.WaitAll(events, 0))
                {
                    Console.WriteLine("All threads finished");
                }
            };

            //线程,把你的处理代码放在这里
            WaitCallback wcb = (status) =>
            {
                //to do, you time cost codes
                Random r = new Random((int)DateTime.Now.Ticks);
                Thread.Sleep(r.Next(100,1000));
                Console.WriteLine("Thread finished");
                //Event置位,表明处理完成
                AutoResetEvent are = status as AutoResetEvent;
                are.Set();
                //通知
                notify();
            };
      
            //放入线程池,每个Thread关联一个AutoResetEvent
            foreach (AutoResetEvent are in events)
            {
                ThreadPool.QueueUserWorkItem(wcb, are);
            }
        }
--------------------编程问答-------------------- en.谢谢楼上的几位。
我先去试试。。 --------------------编程问答-------------------- 建议使用多线程来解决 --------------------编程问答-------------------- 恩,用多线程,如果不适用进度条的话,也可以将鼠标编程沙漏,提高用户体验效果 --------------------编程问答--------------------
引用 3 楼 bloodish 的回复:
给你一个例子,自己去扩展.

C# code

 static void Main(string[] args)
        {
            //定义同步事件
            AutoResetEvent[] events = 
            {
                new AutoResetEvent(false),
      ……


这个很好,能解决你的问题,其实多个线程每个线程加事件也不是坏事儿; --------------------编程问答-------------------- 使用backgroundworker这个控件可以监控到你想要的结果,
做到捕获所有子线程已经结束了。然后。再执行下面报Msg   当然这里你并不要另外再开线程,用while对条件进行限制就可以达到你要的效果
   随手写了个你看一下
   using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MyNewsReader.UI
{
    public partial class Form1 : Form
    {
        BackgroundWorker worker = new BackgroundWorker();
        public Form1()
        {
            InitializeComponent();
            worker.DoWork += new DoWorkEventHandler(worker_DoWork);//后台线程开始
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);//后台线程结束
        }

        void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("线程结束");
        }

        void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            //执行你要执行的内容
            DowWorkTest();
        }

        private void DowWorkTest()
        {
            //这里你可以写你想要做的效果 
            int i = 0;
            while (i < 100)
            {
                i++;
            }
        }
    }
}
    --------------------编程问答-------------------- 异步多线程 委托

backgroundworker --------------------编程问答-------------------- 来学习哈 --------------------编程问答-------------------- 回调也可以吧 --------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,