解決しました
オリバーは正しいようです。何度か試した後、例外が発生し、デバッグモードでは確実に発生します。したがって、これはすべてタイミングに関するものでなければなりません。Matthew wattsonsの回答も確認する必要があります;)
例
まず第一に、私の混乱を説明する小さな例です。
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;
}
}
}
質問
さて、私の質問です。label1.Text = "1";
関数 "ThreadJob"でコメントを外すと、期待どおりにクロススレッド例外が発生します。しかし、例が示すようにコメントを残しておくと、機能します。しかし、なぜ?関数はサブスレッドによって呼び出され、私は何も呼び出しません。したがって、ラベルimoのテキストを変更するのはサブスレッドであり、GUIスレッドではありません。それとも私は何かが足りないのですか?
このように書きます。
void ThreadJob()
{
Action a = () => label1.Text = "1";
this.Invoke(a);
}