2016-12-19 5 views
0

Voici le code qui jette un InvalidOperationExecption Chaque fois que j'essaie de texte à My Label ... Programmaticallycode Lancer InvalidOperationException Tout réglage Texte Étiqueter Programmatically

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

Pourquoi ce code va lancer une exception? Quel est le problème?

"Chargement" est le nom de My Label

enter image description here

+5

Parce que vous avez écrit « Loading .. » avec seulement deux points. –

+2

Assurez-vous que vous êtes sur le thread principal, n'appelant pas à partir d'un thread d'arrière-plan ou d'une tâche asynchrone. Les contrôles ne peuvent obtenir leurs propriétés définies que sur le thread principal, et c'est généralement la raison pour laquelle vous obtenez cette exception. –

+0

Les «informations supplémentaires» vous donne la raison - vous ne pouvez pas définir la propriété d'un contrôle d'interface utilisateur à partir d'un thread différent. –

Répondre

1

Utilisez le répartiteur de thread pour exécuter du code sur le même thread que l'interface utilisateur

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

La plupart des bibliothèques de l'interface utilisateur sont pas thread-safe , vous devez donc faire des changements d'interface utilisateur à partir de leur propre thread.

+1

J'aime que vous ayez pris le temps de mettre 3 points;) –

0

Profitez de la TPL et utiliser la classe de la tâche, cela revenir au fil de contexte après pour reprendre l'exécution

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