2016-12-19 9 views
0

Вот код, который сгенерирует InvalidOperationExecption Каждый раз, когда я пытаюсь установить Text To My Label ... Программного способКод Бросив InvalidOperationException Хотя Настройку текста Для обозначения Программного

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.."; 
    } 
    } 
} 

Почему этот код Выдает исключение? Что в этом плохого?

"Loading" Is The Name Of My Label

enter image description here

+5

Потому что ты написал «Loading ..» только две точки. –

+2

Убедитесь, что вы находитесь в основном потоке, а не вызываете фоновый поток или асинхронную задачу. Элементы управления могут устанавливать только свои свойства в главном потоке, и обычно вы получаете это исключение. –

+0

«Дополнительная информация» дает вам основание - вы не можете установить свойство элемента управления пользовательского интерфейса из другого потока. –

ответ

1

Используй потоковый диспетчер для выполнения кода в том же потоке, как интерфейс

Thread.Sleep(500); 
System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke(() => { 
    Loading.Text = "Loading..."; 
}); 

Большинство библиотек UI не являются поточно , поэтому вы должны внести изменения в пользовательский интерфейс из своего потока.

+1

Мне нравится, что вы нашли время, чтобы положить 3 точки;) –

0

Примите преимущество TPL и использовать класс задач, это будет переключаться обратно в контекст нити после того чтобы возобновить выполнение

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(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^