2013-08-12 40 views
2
更新UI的最佳方式

我有三個類,其中的纖維束的UI類,在MainForm類,我開始一個新的形式在LoginForm類中,執行是什麼mutiThread

new LoginForm.ShowDialog(); 

,我編寫關於登錄和註銷的代碼,當用戶使用時,我啓動一個新線程來檢查是否需要完成某些操作,並更新數據庫;這裏是一個問題,我不知道如何更新MainForm 中的標籤,我搜索這個問題,他們告訴我我應該使用Delegate.but它真的困惑了我很多因爲他們不在同一個類,所以我不知道如何使用委派橫紗和跨不同 到現在爲止,我的代碼是這樣的 MainForm.cs:

public partial class MainForm : Form 
     public delegate void testDelegate(); 
     public MainForm() 
     { 
      InitializeComponent(); 
     } 
     public void msg(string s) 
     { 
      label.Test = s; 
     } 
} 

LoginForm.cs:

JobDoer jD = new JobDoer(); 
Thread t2 = new Thread(new ThreadStart(jD.run)); 
t2.Start(); 

JobDoer:

public void run() 
{ 
    //tD(); 
    tD = new MainForm.testDelegate(MainForm.msg); 
    //this. 
    Thread.Sleep(1000); 
    return; 
} 

接下來應該做什麼? 非常感謝你

+4

UI元素只能由UI線程修改。因此,當您需要修改時,使用調度程序從另一個線程調用UI線程。 – Leri

+0

可以請給我一些演示嗎? –

+0

http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.aspx取決於你使用的東西應該保持這種類型的屬性,允許調用UI線程。 – Leri

回答

0

來自Best Way to Invoke Any Cross-Threaded Code?

你也可以使用擴展方法和lambda表達式使你的代碼乾淨多了。

using System.ComponentModel; 
public static class ISynchronizeInvokeExtensions 
{ 
    public static void InvokeEx<T>(this T @this, Action<T> action) where T : ISynchronizeInvoke 
    { 
    if (@this.InvokeRequired) 
    { 
     @this.Invoke(action, new object[] { @this }); 
    } 
    else 
    { 
     action(@this); 
    } 
    } 
} 

所以,現在你可以在任何ISynchronizeInvoke使用InvokeEx並能夠訪問的屬性和實現類的領域。

this.InvokeEx(f => f.listView1.Items.Clear()); 
相關問題