为什么交叉线程以这种方式工作?

lor*_*ert 10 c# multithreading winforms

解决了

似乎奥利弗是对的.几次尝试后,我得到了异常,在调试模式下我得到了它.所以这一切都与时间有关.你还应该检查马修瓦特森的答案;)

首先是一个可以解释我困惑的小例子.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace testCrossThreading
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            new Thread(ThreadJob).Start();
        }

        void ThreadJob()
        {
            //label1.Text = "1";
            changeText(label1, "1");
        }

        void changeText(Label L, String message)
        {
            L.Text = message;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以现在我的问题是:如果我label1.Text = "1";在函数"ThreadJob"中取消注释,那么我会按预期得到一个Cross线程异常.但如果我留下评论,如示例所示它确实有效.但为什么?该子函数调用该函数,我不调用任何东西.所以它仍然是子线程,而不是改变标签imo文本的GUI线程.或者我错过了什么?

我会这样写的.

void ThreadJob()
        {
            Action a = () => label1.Text = "1";
            this.Invoke(a);
        }
Run Code Online (Sandbox Code Playgroud)

Oli*_*ver 7

我认为这只是一个时间问题.如果您尝试从非gui线程更新gui元素,可以抛出跨线程异常.您甚至可以通过调用禁用整个跨线程异常

Form.CheckForIllegalCrossThreadCalls = false;
Run Code Online (Sandbox Code Playgroud)

但是在异常消失之后,进一步的行为是未定义的,并且可能导致非常微妙的错误.因此,将异常作为代码气味的提示,但请注意,即使应该是异常,也不会抛出异常.