Бросание кода 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();
    }
}
Другие вопросы по тегам