Из некоторого базового тестирования выясняется, что единственная причина, по которой вы не получаете исключение кросс-потока, заключается в том, что текст, который вы поместили в label2
из другого потока, соответствует уже существующему тексту, поэтому обновление в моем случае не требуется Thread.CurrentContext.ContextID
было 0.
Например:
private async void button2_Click(object sender, EventArgs e)
{
label2.Text = "Null";
await Task.Run(() =>
{
Thread.Sleep(2000);
label2.Text = SynchronizationContext.Current?.ToString() ?? "Null";
Thread.Sleep(2000);
});
label2.Text = "Done";
}
Однако этот код выполняется без исключения, если мы изменим текст:
private async void button2_Click(object sender, EventArgs e)
{
label2.Text = SynchronizationContext.Current.ToString(); //WinForms Sync Context
await Task.Run(() =>
{
Thread.Sleep(2000);
label2.Text = SynchronizationContext.Current?.ToString() ?? "Null";
Thread.Sleep(2000);
});
label2.Text = "Done";
}
Теперь мы получим перекрестную нить, InvalidOperationException
, как и ожидалось. Поэтому, если мы не изменим значение компонента потока пользовательского интерфейса, исключение не произойдет, если мы изменим значение, мы получим ожидаемое исключение.