1:一个问题,我需要这样一个功能,要写入10个EXCEL,为了不影响主程序的进行,所以我新开了一个线程
Thread t=new Thread(writeExcel);
t.start();   
2:我想在这个线程结束后给我个提示:“excel写入完成”.
3:但是这个Messagebox我由于有其他的情况,所以不能把他写在writeExcel里面,因为我主线程同时还要做别的操作。
4:问题是我怎么在t.start()结束后给我的主程序一个信号,让主程序继续运行(但必须的在这个线程结束后)

解决方案 »

  1.   

    可以 但是我不太会做事件,怎么做比如用一个console.write(“写入excel”),举个例子可以吗?
      

  2.   

    t.jion阻塞掉其它线程,t执行完会取消阻塞
      

  3.   

    关键是我咋知道他 执行完啊?我是写在 :        private void button1_Click(object sender, EventArgs e)
            {
                Frmprogess fm = new Frmprogess();
                fm.StartPosition = FormStartPosition.CenterScreen;
                fm.Show();
                Thread t = new Thread(outmorning);
                t.Start();
                Messagebox.show("写入完成");        }
    我一个点CLICK后他全都给我执行了,我就想让fm.show()正常执行,然后执行后自己弹出提示,兄弟们帮我顶下啊
      

  4.   

    t.Start()后面跟一个t.Jion()试试
      

  5.   

    楼主不是说不能在writeExcel里写吗?
    你用事件,那还不是要在writeExcel里调用吗如果实在不能在writeExcel里写,也不能阻塞主线程的话,就再开一个线程
    Thread t2=new Thread(()=>
    {
    t.Join();
    MessageBox.Show(.......);
    });
    或者用一个Timer来反复检测t线程是否终止
    t2.Start();
      

  6.   

    楼上的,你再开线程是不可以的,线程的执行顺序是和CPU有关系的,所以没办法每次按照一定的顺序执行,这这个方法我尝试过了
      

  7.   

    可以再开一个线程,用t.isAlive()来判断线程是否处于活动状态,楼主看看这样可以不可以.
      

  8.   

    要么用托管,要么用消息。
    托管:
    delegate bool ExecuteOver();
    定义一个子线程类,在子线程里,申明一个托管的变量,
    等你子线程执行完成,调用此托管方法。
    在主线程里,启动子线程之前,设置子线程的托管变量为你要执行的函数。消息:
    const WM_EXECUTEOVER = WM_USER + 0x0001;
    定义一个子线程类,在子线程里,申明一个指针型变量IntPtr,
    等你子线程执行完成,给此变量发送消息。
    在主线程里,启动子线程之前,设置子线程的指针型变量为主窗口的句柄,
    在主线程里捕捉消息,执行你的函数。
      

  9.   

    在方法里用变量str标记,然后用timer检测str的值即可.
      

  10.   

      public class ExcelThread
            {
                private Thread _Thread;            public ExcelThread()
                {
                    Thread t = new Thread(writeExcel);
                }            public void Star()
                {
                    this.Star();
                }            public void writeExcel()
                {
                    //.....操作                if (Over != null) Over();
                }            public delegate void ThreadRunOver();
                public event ThreadRunOver Over;        }
    使用的时候          public void StarWriteExcel()
            {
                ExcelThread a = new ExcelThread();
                
                a.Over += new ExcelThread.ThreadRunOver(a_Over);
                a.Star();
            }        void a_Over()
            {
                MessageBox.Show("????");
            }
    不知道是不是这个意思
      

  11.   

    啥也不说了,12楼我爱你 ,帅,我发下代码方便以后大家共享:
      Frmprogess fm = new Frmprogess();
                fm.StartPosition = FormStartPosition.CenterScreen;
                fm.Show();             ExcelThread a = new ExcelThread();
                a.Over += new ExcelThread.ThreadRunOver(a_Over);
                a.Star();   public class ExcelThread
        {
            private Thread _Thread;        public ExcelThread()
            {
                Thread t = new Thread(writeExcel);
                _Thread = t;
            }        public void Star()
            {
                _Thread.Start();
            }
            public void writeExcel()
            {
                  Excelwrite()//方法
                if (Over != null) Over();
            }
            public delegate void ThreadRunOver();
            public event ThreadRunOver Over;    }