2015-08-18 110 views
2

我想弄清楚如何線程工作在Windows移動設備(6.0)與緊湊框架2.0。現在我正在努力建立一個進度條,因爲它是最基本的東西之一,基本上在我找到的每個教程中都是如此。線程Windows Mobile 6緊湊框架

從正常的Windows窗體 - 應用程序我已經習慣了這樣做:

for (int i = 0; i < 10; i++) 
{ 
    myProgressBar.BeginInvoke(
    new Action(() => 
     { 
      myProgressBar.Value = i; 
      Thread.Sleep(100); 
     } 
    )); 
} 

但我會在new Action(()...一個錯誤:

型(通用)的 「System.Action<T>」 的用法需要1型參數
(翻譯自德語)

它似乎Action()不可用於我,只有Action<T>()。但我不知道參數T應該是什麼或者給Action<T>()什麼論點。

+1

順便說一下,考慮使用.NET CF 3.5而不是2.0 – tcarvin

回答

1

首先,您的代碼可以執行不完全等待,因爲您正在使用i變量的關閉,對於正確的工作,您應該將i複製到局部變量。另外,您可以簡化代碼,而不是創建Action對象,但是可以創建use simple lambda expression here, and convert it to Action

因此,最終的代碼可能是這樣的(添加了一些小的修正的增量和var關鍵字):

for (var i = 0; i < 10; ++i) 
{ 
    var localI = i; 
    myProgressBar.BeginInvoke(
     (Action)(() => 
     { 
      myProgressBar.Value = localI; 
      Thread.Sleep(100); 
     } 
    )); 
} 

由於非通用類不適用於你,你可以投的方法你傳遞給BeginInvoke到一些代表從非標準庫,例如,MethodInvoker(支持.NET Framework Client Profile受 ),並使用不拉姆達,但delegate關鍵字爲簡化代碼:

for (var i = 0; i < 10; ++i) 
{ 
    var localI = i; 
    myProgressBar.BeginInvoke(
     (MethodInvoker) delegate() 
     { 
      myProgressBar.Value = localI; 
      Thread.Sleep(100); 
     } 
    ); 
} 

但我想讓你知道Thread.Sleep這裏會凍結UI線程,而不是後臺線程,因爲你在目標線程上調用Action所以,你不如把這些代碼進行UI更新:

for (var i = 0; i < 10; ++i) 
{ 
    var localI = i; 
    myProgressBar.BeginInvoke((MethodInvoker) delegate() 
     { 
      myProgressBar.Value = localI; 
     }); 
    Thread.Sleep(100); 
} 
+0

感謝您的建議。主要問題仍然存在。 '(Action)'不會編譯,因爲'Action()'不可用。唯一可用的是'Action ()'。所以我必須指定一個類型和giva這個類型的變量。 – FNR

+0

你試過了嗎?您不需要使用構造函數創建動作,只需要投射)。 – VMAtm

+0

@FNR「BeginInvoke」的簽名究竟是什麼?它可以在MSDN上找到嗎? – VMAtm

1

當尋找一個MethodInvoker替代由@VMAtm指出,我終於發現,與緊湊的框架工作的方式:

for (int i = 0; i < 10; i++) 
{ 
    var localI = i; 
    myProgressBar.BeginInvoke(
    (ThreadStart)delegate() 
     { 
      myProgressBar.Value = localI; 
     } 
    ); 
    Thread.Sleep(100); 
} 
+0

哦,忘了'ThreadStart'選項。 – VMAtm