已解决
看起来 Oliver 是正确的。经过多次尝试,我得到了异常,在调试模式下我确信得到了它。所以这一切都与时序有关。您还应该检查 Matthew Watson 的回答 ;)
示例
首先是一个小例子,它将解释我的困惑。
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;
}
}
}
问题
现在我的问题是:如果我在“ThreadJob”函数中取消注释label1.Text = "1";
,那么我会像预期的那样得到一个跨线程异常。
但是,如果我像示例所示将它保持已注释状态,则它可以正常工作。但是为什么呢?
该函数由子线程调用,我没有调用任何内容。因此,在我看来,仍然是子线程而不是GUI线程更改标签文本。还是我漏掉了什么?
我会这样写。
void ThreadJob()
{
Action a = () => label1.Text = "1";
this.Invoke(a);
}
L.Text = message;
上出现了跨线程异常。我看不出它如何能为您工作。 - MrBlue