none
winform 线程问题 RRS feed

  • 问题

  • private void OpenBillD_Click(object sender, EventArgs e) { Thread td = new Thread(new ThreadStart(() => { EaseMain bill = new EaseMain(); bill.MdiParent = this; bill.WindowState = FormWindowState.Maximized; bill.Show(); })); td.Start(); }

    EaseMain 是一个窗体,OpenBillD_Click是一个按钮事件;

    错误

    :线程间操作无效: 从不是创建控件的线程访问它

    这是为什么啊???????????



    大其心,可容天下之物; 虚其心,可受天下之善;

    • 已更改类型 Neddy Ren 2012年3月6日 8:08
    2012年3月5日 3:24

答案

  • 你好,

    在多线程中,除了UI以外,是不允许其它线程直接操作UI线程上的UI元素。接下来我提供一种方法来实现需要的功能:

    public delegate void RunDelegateMehtod();
    
    public void RunMethod()
    {
        EaseMain bill = new EaseMain();
        bill.MdiParent = this;
        bill.WindowState = FormWindowState.Maximized;
        bill.Show();
    }
    
    private void OpenBillD_Click(object sender, EventArgs e)
    {
        Thread td = new Thread(new ThreadStart(() =>
        {
            RunDelegateMehtod delegateMethod = new RunDelegateMehtod(RunMethod);
            this.Invoke(delegateMethod);
    
        }));
        td.Start();
    }
    这样你就可以实现你需要的功能了!


    Neddy Ren[MSFT]
    MSDN Community Support | Feedback to us

    • 已建议为答案 Jacky_shen 2012年3月7日 2:06
    • 已标记为答案 Neddy Ren 2012年3月14日 9:37
    2012年3月6日 8:05
  • 1.Control.CheckForIllegalCrossThreadCalls = false; 把这个放在Form_loading()

    事件里。

    不推荐使用这个方法,CheckForIllegalCrossThreadCalls 是一个静态变量,随时会被任意程序修改,而且这会导致线程运行不安全。

    Knowledge will change the destiny.

    • 已标记为答案 Neddy Ren 2012年3月14日 9:37
    2012年3月6日 8:08
  • dear

    1.非常不建议使用CheckForIllegalCrossThreadCalls 这会导致未知的错误

    2.这是线程操作常发生的跨线程问题

    http://www.dotblogs.com.tw/yc421206/archive/2009/02/13/7141.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    • 已标记为答案 Neddy Ren 2012年3月14日 9:37
    2012年3月6日 11:27

全部回复

  • Hi,

     

    你这个有两种方法解决:

    1.Control.CheckForIllegalCrossThreadCalls = false; 把这个放在Form_loading()

    事件里。

    2.判断这个控件的InvokeRequired属性是否为true,是的话调用你所定义的委托事件.


    orichisonic http://blog.csdn.net/orichisonic If a post answers your question, please click "Mark As Answer" on that post and "Mark as Helpful".

    2012年3月5日 9:51
  • 你好,

    在多线程中,除了UI以外,是不允许其它线程直接操作UI线程上的UI元素。接下来我提供一种方法来实现需要的功能:

    public delegate void RunDelegateMehtod();
    
    public void RunMethod()
    {
        EaseMain bill = new EaseMain();
        bill.MdiParent = this;
        bill.WindowState = FormWindowState.Maximized;
        bill.Show();
    }
    
    private void OpenBillD_Click(object sender, EventArgs e)
    {
        Thread td = new Thread(new ThreadStart(() =>
        {
            RunDelegateMehtod delegateMethod = new RunDelegateMehtod(RunMethod);
            this.Invoke(delegateMethod);
    
        }));
        td.Start();
    }
    这样你就可以实现你需要的功能了!


    Neddy Ren[MSFT]
    MSDN Community Support | Feedback to us

    • 已建议为答案 Jacky_shen 2012年3月7日 2:06
    • 已标记为答案 Neddy Ren 2012年3月14日 9:37
    2012年3月6日 8:05
  • 1.Control.CheckForIllegalCrossThreadCalls = false; 把这个放在Form_loading()

    事件里。

    不推荐使用这个方法,CheckForIllegalCrossThreadCalls 是一个静态变量,随时会被任意程序修改,而且这会导致线程运行不安全。

    Knowledge will change the destiny.

    • 已标记为答案 Neddy Ren 2012年3月14日 9:37
    2012年3月6日 8:08
  • dear

    1.非常不建议使用CheckForIllegalCrossThreadCalls 这会导致未知的错误

    2.这是线程操作常发生的跨线程问题

    http://www.dotblogs.com.tw/yc421206/archive/2009/02/13/7141.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    • 已标记为答案 Neddy Ren 2012年3月14日 9:37
    2012年3月6日 11:27