2009-03-03 41 views
2

我正在開發一個的Windows Mobile應用(Compact Framework的2.0 SP1)和驗證碼它的產生我一個錯誤:C#線程和this.Invalidate()

 


     public Image Imagen 
     { 
      get 
      { 
       return imagen; 
      } 
      set 
      { 
       imagen = value; 
       this.Invalidate(); 
      } 
     } 
 

的代碼是從所謂的一個新的線程。我試着用**來解決InvokeRequired:

 

     public Image Imagen 
     { 
      get 
      { 
       return imagen; 
      } 
      set 
      { 
       imagen = value; 
       if (this.InvokeRequired) 
        this.Invoke(this.Invalidate); 
       else 
        this.Invalidate(); 
      } 
     } 
 

但行this.Invoke(this.Invalidate);不能編譯。我該如何解決這個問題?第一個錯誤是您可以與另一個線程上創建的控件進行交互。

謝謝!

回答

3

試試這個。

爲什麼這是必要的冗長的版本。 Invoke方法不採用特定的Delegate類型作爲參數,而是使用System.Delegate類型。此類型不提供強類型簽名的打字。它是基礎委託類,而是提供調用所有委託的通用機制。

不幸的是,在C#中作爲委託源傳遞方法名稱時,它必須傳遞給特定的委託類型。否則C#不知道在底層創建什麼類型的委託,與VB不同,它不會生成匿名委託類型。這就是爲什麼您需要特定的委託類型(如MethodInvoker)才能調用該函數。

編輯手動定義MethodInvoker,因爲它沒有在契約框架

存在
public delegate void MethodInvoker(); 

public Image Imagen 
{ 
    get { get return imagen; } 
    set { 
     imagen = value; 
     if (this.InvokeRequired) 
      this.Invoke(new MethodInvoker(this.Invalidate)); 
     else 
      this.Invalidate(); 
    } 
} 
0

函數調用預計的委託,所以你可以在Action委託使用內置:

public Image Imagen 
{ 
    get 
    { 
     return imagen; 
    } 
    set 
    { 
     imagen = value; 
     if (this.InvokeRequired) 
      this.Invoke(new Action(this.Invalidate)); 
     else 
      this.Invalidate(); 
    } 
} 
+0

它不起作用。 Action需要一個T泛型類型。 – VansFannel 2009-03-03 19:14:18

+0

@VansFannel,System.Action(no-generics)被添加到.net 3.5中 – JaredPar 2009-03-03 19:27:46

0

我對Compact Framework的2.0 SP1的解決方案是這樣的:

 
... 

delegate void InvocadorMetodos(); 

... 

     public Image Imagen 
     { 
      get 
      { 
       return imagen; 
      } 
      set 
      { 
       imagen = value; 
       if (this.InvokeRequired) 
       { 
        InvocadorMetodos invalida = Invalidar; 
        this.Invoke(invalida); 
       } 
       else 
        this.Invalidar(); 

      } 
     } 

 

謝謝!

6

失效不需要調用。

invalidate只包含一個paint消息,由主線程和其餘的待處理消息處理。但是當你調用invalidate並且控件沒有被這個線程改變時,paint不會完成,所以你不需要爲它調用它。

如果您需要確保控件被刷新,也許invalidate是不夠的,你也需要調用更新。