什么时候我允许跨线程访问,什么时候不允许?

时间:2013-11-24 02:41:50

标签: c# multithreading

似乎C#有时会抛出跨线程操作的异常。例如,您可以尝试在Windows窗体程序中运行此示例代码:

    public Form1()
    {
        InitializeComponent();
        Thread setTextT = new Thread(TextSetter);
        setTextT.Start();
    }

    private void TextSetter()
    {
        //Thread.Sleep(4000);
        textBox1.Text = "Hello World";
    }

它没有抛出任何异常,一切似乎都运行正常。现在,当您取消注释Thread.Sleep行时,它将为尝试的跨线程访问抛出异常。

为什么会这样?

2 个答案:

答案 0 :(得分:5)

这是因为交叉线程检查仅在创建the window's handle之后发生,因为您要检查的是对窗口句柄的跨线程访问。当您没有睡眠时,代码会在第一次显示控件之前运行得足够快(第一次显示控件时会创建句柄)。

知道是否需要注意UI控件的跨线程访问的简单方法只需检查InvokeRequired,如果确实如此,则需要调用Invoke(或{{1}如果你不想等待它完成)来获得创建控件的线程。

答案 1 :(得分:0)

试试这个:

   public Form1()
    {
        InitializeComponent();
        Thread setTextT = new Thread(TextSetter);
        setTextT.Start();
    }

    private void TextSetter()
    {
        //Thread.Sleep(4000);
        //textBox1.Text = "Hello World";
        //You have to Invoke your action to the UI thread
        Invoke(new Action(()=>textBox1.Text = "Hello World"));
    }