2015-04-23 58 views
0

因此,我使用此代碼的總體目標是從不同線程(以安全方式)設置標籤的文本屬性。代表和設置標籤

namespace csDinger3 
{ 
    public delegate void setlblStarted_txt(string text); 

    public partial class ClientUI : Form 
    { 
     public void setlblStarted_txt(string text) 
     { 
      var setlblStarted a = new setlblStarted(setlblStarted_txt); 
      if (this.lblStarted.InvokeRequired) 
      { 
       this.Invoke(a, new object[] { text }); 
      } 
      else 
      { 
       this.lblStarted.Text = text; 
      } 
     } 
    } 
} 

調用代碼:

namespace csDinger3 
{ 
    public class Program 
    { 
     // Some code that's not relevant 
     public static void updateText(Int32 number) 
     { 
      setlblStarted x = new setlblStarted(ClientUI.setlblStarted_txt); 
      x(number.ToString()); 
     } 
    } 
} 

從我能理解(並請糾正我,如果我錯了),我需要創建的setlblStarted_txt一個新實例,點,在法新實例setlblStarted_txt,但問題是目前ClientUI.setlblStarted_txt不是靜態的,而是想要一個對象引用。

我使用ClientUI c = new ClientUI();嘗試過,但不工作(因爲它創建窗體的新實例?)

我在做什麼錯了,如果可能的話,你能告訴我爲什麼?

+3

你到底想達到什麼目的?在.NET 4.0中,大部分時間你都不需要聲明委託。 – abatishchev

+0

你爲什麼要把這段代碼放到'Program'類中?這是啓動應用程序的人。你應該把它放在WinForms類的代碼後面。 – Cameron

+0

@Cameron我用這個作爲中心類,但我想我可以改變它很容易 –

回答

0

在.NET 4.0中,你可以使用動作:

if (InvokeRequired) 
{ 
    Invoke(new Action<string>(updateText), "some text"); 
} 
else 
{ 
    updateText("some text"); 
} 

此外,void updateText(string text)不需要是靜態的。

+0

@harismranb'updateText'在不同的線程上,我需要調用'setlblEarned_txt'方法。 我會用'setlblEarned_txt'替換'updateText'嗎? –

0

據我所知,您正嘗試使用MethodInvoker委託來更新您的文本。我建議你改變這種方法來簡化代碼:

namespace csDinger3 
{ 
    public class Program 
    { 
     static ClientUI aForm; 

     static void Main() 
     { 
      aForm = new ClientUI(); 
      aForm.Show(); 
     } 
     // Some code that's not relevant 
     public static void updateText(Int32 number) 
     { 
      aForm.setlblStarted_txt(number.ToString()); 
     } 

public partial class ClientUI : Form 
{ 
    public void setlblStarted_txt(string text) 
    { 
     if (lblStarted.InvokeRequired) 
     { 
      Invoke(new EventHandler(delegate 
      { 
       lblStarted.Text = text 
      })); 
     } 
     else 
     { 
      lblStarted.Text = text; 
     } 
    } 

您可以使用ThreadPoolSynchronizationContextDispatcher(在WPF)實現相同的行爲。請參閱本教程爲更好地理解: