请教大家 多线程之间怎么实现通信。比如,A线程是用户界面线程,B线程是工作线程。现在,B线程要不断的Working,当数据Ok后,需要“通知”A线程去Update界面。How to do that ? Thank you !

解决方案 »

  1.   

    delegate void ShowMessageHandler(string message);//要跨线程调用的代理
    class UIForm : Form
    {
        public void ShowMessage(string message)
        {
            if(this.InvokeRequired)
            {
                this.BeginInvoke(UI, message)//强烈建议不要用this.Invoke,N多项目总结,在这里实现跨线程
            }
            else
            {
                this.Text = message;//假设这就是你的应用
            }
        }
    }class Worker
    {
        public void WorkFunc(object state)
        {
            UIForm ui = state as UIForm;
            while(ContinueFlag)// a bool flag which enable the work thread alive
            {
                // do something
                ui.ShowMessage("hello csdn");
                // do something else
            }
        }
    }
      

  2.   

    this.BeginInvoke(UI, message)这一行可能还需要new一个ShowMessageHandler类型的代理吧,我是直接编辑的
      

  3.   

      秒大刀,对于你的程序结构。
      所有的工作都是Worker在做,你发现没?而实际需要“Working”和“Show”在不同的线程中完成,以分解工作负荷。
      

  4.   

    都是用C#开发的?
    那用SendMessage.重写WndProc,用SendMessage通过句柄发送自定义消息,然后在WndProc里面处理.
      

  5.   

    干嘛那么麻烦,直接b线程工作完毕操作界面不就ok了
    只是要设置下,control的允许其它线程操作
      

  6.   

    即使非要建个a线程
    就在b结束的时候启动a就可以了,要通信干么
    即使要通信,如果不是启动a线程,
    非要通过参数来控制,那就不是即时了,要用sleep,要用循环
    当参数正确的时候a执行。
      

  7.   

    什么叫“多线程”,就是应该让不同的线程去做不同的工作。
    如果都在B线程中调去调来的,那岂不是所有的事情都让B线程做了,那我们还要多线程来干嘛呢?如果你的程序做大了,你就会明白,多线程是可以提高性能的,虽然增加了线程之间通信的开销,但是总的来说是提高了性能。我现在明白怎么做了!还是采用消息机制。贴出一些代码来,以享大家:发送:
            public IntPtr hdlWnd; // 窗口句柄
            ...
            hdlWnd = this.Handle;
            ...        SendMessage(hdlWnd, WM_Fin, IntPtr.Zero, para.ToString());接受:
            //
            // 摘要:
            //     A线程消息处理
            protected override void DefWndProc(ref System.Windows.Forms.Message m)
            {
                switch (m.Msg)
                {
                    case WM_Lbutton:
                        ///string与MFC中的CString的Format函数的使用方法有所不同
                        //string message = string.Format("收到消息!参数为:{0},{1}", m.wParam, m.lParam);
                        //MessageBox.Show(message);///显示一个消息框
                        break;                case WM_Fin:
                        TestFunc(Marshal.PtrToStringAnsi(m.LParam));
                        break;                default:
                        base.DefWndProc(ref m);///调用基类函数处理非自定义消息。
                        break;
                }
            }
            [DllImport("User32.dll", EntryPoint = "SendMessage")]
            private static extern int SendMessage(
                int hWnd,      // handle to destination window
                int Msg,       // message
                int wParam,    // first message parameter
                int lParam     // second message parameter
                );
            [DllImport("user32.dll", EntryPoint = "SendMessageA")]
            private static extern int SendMessage(
                IntPtr  hwnd,
                int     wMsg,
                IntPtr  wParam,
                string  lParam
                );
      

  8.   

    多线程通信可以使用.net remoting
      

  9.   

    .NET Remoting ?
    What's it ? Could you please offer an example ? 
      

  10.   

    多线程通信可以用c# socket你到网上去找一些那方面的资料,我公司最近也在做这个·!
      

  11.   

    你给Worker和Show加上断点,然后把调试器打开到线程窗口,你就知道哪个线程在做哪部分工作了 :-)
    貌似事件不行吧?或者异步代理可以达到要求
    在.net 1.1的时候曾经是这么搞的,但这会发生令人郁闷的死锁和其他一些意外的事情,而且还不一定是小概率事件
    这个就不说啥了,嘿,有时候还就得用多线程
    这个可以,但只适合工作线程向主线程传递数据(消息循环只存在于主线程上),而且传递的数据量很有限
    工作线程向主线程传递大量数据的时候还是需要通过delegate进行跨线程操作(微软官方推荐)
    工作线程和工作线程之间的数据传递则需要同步互斥机制
    remoting是设计用于局域网类似环境的RPC的,效率不高,而线程通信代价本应是非常非常低廉的,托管线程更是这样的