C# .NET8 WinForm Cross-Thread Exception из делегата обратного вызоваC#

Место общения программистов C#
Ответить
Anonymous
 C# .NET8 WinForm Cross-Thread Exception из делегата обратного вызова

Сообщение Anonymous »

В настоящее время я работаю над проектом приложения WinForm на C# .NET8, в котором я использую таймер потока после загрузки формы. Я получаю межпотоковое исключение в методе, настроенном на делегирование для решения этой проблемы.

Код: Выделить всё

private System.Threading.Timer? startTimer = default;
private WaitIndicator? waitor = default;
private void delegate ChangeVisibilityCallBack(bool visible);

private void Form_Load(object? sender, EventArgs e)
{
startTimer = new(Tick, null, 1000, 0);
}

private void Tick(object? state)
{
ChangeVisibility(true);
...
ChangeVisibility(false);
}

private void ChangeVisibility(bool value)
{
if (InvokeRequired)
{
ChangeVisibilityCallBack cb = new(ChangeVisibility);
this.Invoke(cb, value);
}
else
{
waitor!.Visible = value; //Here is where I'm getting the exception stated below.
if (Visible)
waitor!.BringToFront();
else
waitor!.SendToBack();
waitor!.Refresh();
waitor!.Update();
}
}
Исключение: System.InvalidOperationException: «Недопустимая межпоточная операция: доступ к элементу управления «WaitIndicator» осуществляется из потока, отличного от потока, в котором он был создан».
WaitIndicator — это пользовательский элемент управления, и я считаю, что именно он вызывает эту проблему. Любая помощь или переписывание будут очень признательны. Любой другой необходимый код я также могу опубликовать.
Я также пробовал просто Invoke, а не this.Invoke, также пробовал Invoke(new Action(()=> { ChangeVisibility(value);}) и все еще получает межпотоковое исключение.
Обзор:
инициализация ожидания
waitor = new() { Text = "Пожалуйста, подождите", Font = new("Gamestation Condensed", 14, FontStyle.Bold) };
Ответ:
Из этого я разобрался в вопросе. Дошло до добавления его в форму. Так как это была переменная control вместо добавленного дизайнером элемента управления, я забыл добавить его в форму и после добавления this.Controls.Add(waitor); ошибка была устранена.

Подробнее здесь: https://stackoverflow.com/questions/790 ... k-delegate
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»