日期:2014-05-17  浏览次数:20873 次

C# 跨线程操作问题
我现在写了一个c#的winform程序,后台有一个线程在监听局域网中的信息,收到信息后要在主窗体中动态创建一个自定义组件,但是建了组件之后我点击组件进行操作就出错,因为不是主线程创建的组件,所以不能操作。。。求大神指导
C#跨线程操作? C#??线程间通信

------解决方案--------------------
用Control.Invoke,把创建界面的代码用委托写好了让UI线程调用。
------解决方案--------------------
我这有个例子,希望对你有帮助

   //首先声明一个委托
    delegate void ShowMethod(object o);
    ShowMethod s;

    
    public Form1()
    {
       s=new ShowMethod(OperateCom);
        //声明新的线程并调用方法
       Thread newThread = new Thread(ThreadOperate);
       newThread.Start();
    }
    
    private void ThreadOperate()
    {
        this.Invoke(s, new object[] { "操作" });
    }

     private void OperateCom(object o)
     {
         Button btn1 = new Button();
         btn1.Text = o.ToString();
         btn1.Name = "btnOperate";
         btn1.Click+=new EventHandler(btn1_Click);
         this.Controls.Add(btn1);
     }


     private void btn1_Click(object sender, EventArgs e)
     {
         MessageBox.Show("谢谢");
     }

------解决方案--------------------
你在定义委托处理的方法里增加组件就可以了。
那就是主线程里添加的。
------解决方案--------------------
两种方法 :
一种是用委托,这个上面的也说了
还有一种是在监听线程里的开头加这一句 CheckForIllegalCrossThreadCalls = false;
这个方法不安全,不如委托,不过也可以解决问题