Бросание кода InvalidOperationException при установке текста для маркировки программно
Вот код, который выбрасывает InvalidOperationExecption каждый раз, когда я пытаюсь программно установить текст на ярлык...
using System;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace Project
{
public partial class Splash : Form
{
public Splash()
{
InitializeComponent();
Thread quit = new Thread(Quit);
Thread Load = new Thread(LoadIt);
Load.Start();
quit.Start();
}
private void Splash_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit();
}
public static void Quit()
{
Thread.Sleep(3000);
Application.Exit();
}
public void LoadIt()
{
Thread.Sleep(500);
Loading.Text = "Loading..";
}
}
}
Почему этот код создает исключение? Что не так в этом?
"Загрузка" - это название моей этикетки
2 ответа
Используйте диспетчер потоков, чтобы выполнить код в том же потоке, что и пользовательский интерфейс
Thread.Sleep(500);
System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke(() => {
Loading.Text = "Loading...";
});
Большинство библиотек пользовательского интерфейса не являются поточно-ориентированными, поэтому вы должны вносить изменения в их собственные потоки.
Воспользуйтесь преимуществами TPL и используйте класс Task, это переключится обратно на поток контекста после возобновления выполнения.
public partial class Splash : Form
{
public Splash()
{
InitializeComponent();
}
private void Splash_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit();
}
private void Splash_OnLoad(object sender, FormClosingEventArgs e)
{
await Task.Delay(500);
Loading.Text = "Loading..";
await Task.Delay(3000);
Application.Exit();
}
}