Если вы находитесь в режиме отладки, взгляните на окно вывода. Он должен показывать сообщение об исключении примерно так:
System.InvalidOperationException 'в System.Windows.Forms.dll.
Это потому, что label1
получен доступ из потока, отличного от потока, в котором он был создан. И это вызовет недопустимую многопоточную операцию.
Вы можете решить эту проблему, используя Control.Invoke
, как уже упоминал Дмитрий Быченко. Вот простое расширение для выполнения поточно-ориентированных вызовов в Winforms Control.
public static void TryInvoke(this Control control, Action<Control> action)
{
if (control.InvokeRequired) control.Invoke(new Action(() => action(control)));
else action(control);
}
Пример использования
label1.TryInvoke(x => x.Text = "test");
label1.TryInvoke(x => x.ForeColor = Color.Blue);
Или
this.TryInvoke(x =>
{
label1.Text = "test";
label1.ForeColor = Color.Blue;
});
Во-вторых, поскольку вы ничего не ждете в monitor_r
, я бы рекомендовал использовать void
вместо async Task
.
Даже если вы ждете чего-то в monitor_r
, вам не нужно
await Task.Run(() => {
monitor_r(label1);
});
.. потому что monitor_r
само по себе является задачей. Так что просто позвоните await monitor_r(label1);