2016-12-19 80 views
0

這裏是拋出一個InvalidOperationExecption每次我嘗試將文本設置爲我的標籤編程守則...代碼拋出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.."; 
    } 
    } 
} 

爲什麼這個代碼引發異常?這有什麼錯誤?

「加載」是我的標籤

enter image description here

+5

因爲你寫了「中..」只有兩個點。 –

+2

確保您位於主線程中,而不是從後臺線程或異步任務調用。控件只能在主線程上設置它們的屬性,這通常就是你得到這個異常的原因。 –

+0

「其他信息」爲您提供了原因 - 您無法從其他線程設置UI控件的屬性。 –

回答

1

使用線程調度員在同一線程上執行代碼作爲用戶界面的名稱

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

大多數UI庫不是線程安全,所以你必須從他們自己的線程中進行UI更改。第三方物流的

+1

我喜歡你花時間放3個點;) –

0

乘虛而入,使用任務類,這會切換回上下文線程之後恢復執行

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(); 
    } 
} 
相關問題