2012-03-06 163 views
1

我有一個ListBox,我把一些文件,如果該文件不是AVI我會自動轉換它,但我想當文件轉換消息將寫在標籤上的文件現在轉換爲另一種格式,我知道我需要使用Dispatcher爲了更新UI線程,但我現在使用Winform而不是WPF,並且我需要幫助。 BTW,因爲我使用.net 3.5更新UI線程

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    System.IO.Stream myStream; 
    OpenFileDialog thisDialog = new OpenFileDialog(); 
    thisDialog.InitialDirectory = "c:\\"; 
    thisDialog.Filter = "All files (*.*)|*.*"; 
    thisDialog.FilterIndex = 1; 
    thisDialog.RestoreDirectory = false; 
    thisDialog.Multiselect = true; // Allow the user to select multiple files 
    thisDialog.Title = "Please Select Source File"; 
    thisDialog.FileName = lastPath; 
    List<string> list = new List<string>(); 

    if (thisDialog.ShowDialog() == DialogResult.OK) 
    { 
     foreach (String file in thisDialog.FileNames) 
     { 
      try 
      { 
       if ((myStream = thisDialog.OpenFile()) != null) 
       { 
        using (myStream) 
        { 
         listBoxFiles.Items.Add(file); 
         lastPath = file; 
        } 
       } 
      } 

      catch (Exception ex) 
      { 
       MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); 
      } 
     } 

     for (int i = 0; i < listBoxFiles.Items.Count; i++) 
     { 
      string path = (string)listBoxFiles.Items[i]; 
      FileInfo fileInfo = new FileInfo(path); 

      if (fileInfo.Extension != ".AVI") 
      { 
       listToRemove.Add(path); 
      } 
     } 

     (new System.Threading.Thread(sendFilesToConvertToPcap)).Start(); 

     foreach (string file in listToRemove) //remove all non .AVI files from listbox 
     { 
      listBoxFiles.Items.Remove(file); 
     } 
    } 
} 

此功能需要改變標籤我無法使用任務:

 public void sendFilesToConvertToPcap() 
     { 
      if (listToRemove.Count == 0) // nothing to do 
      { 
       return; 
      } 

lblStatus2.Content = "Convert file to .AVI..."; 

      foreach (String file in listToRemove) 
      { 
       FileInfo fileInfo = new FileInfo(file); 
       myClass = new (class who convert the files)(fileInfo); 
       String newFileName = myClass.mNewFileName; 
       listBoxFiles.Items.Add(myClass._newFileName); 
      } 

lblStatus2.Content = "Finished..."; 

     } 
+0

因此,您想運行一個長時間運行的進程(在後臺進行轉換),並使用轉換進程的進度更新標籤? – bloudraak 2012-03-06 19:49:19

+1

使用'BackgroundWorker'組件。 – 2012-03-06 19:52:28

+0

很難說這裏的問題是什麼。長示例代碼。本地化。關! – usr 2012-03-06 19:56:51

回答

0
public void sendFilesToConvertToPcap() 
{ 
    ..... 
    .... 
    this.Invoke((MethodInvoker)delegate { 
    lblStatus2.Text = "Convert file to .AVI..."; }); 

.... 
} 
+0

謝謝你的幫助 – user979033 2012-03-06 21:19:34

2

從你的問題,看來你要轉換多個文件。您可能需要考慮使用BackgroundWorker類,並按照this article中所述覆蓋DoWork和ProgressChanged事件。您可以更新ProgressChanged事件中的標籤和其他控件。

+0

謝謝你的回覆 – user979033 2012-03-06 21:19:51

0

對於長時間運行的過程,這是一個非常普遍的要求。如果你沒有在一個單獨的線程上明確地調用方法,它們將自動運行在main(參見:UI)線程上,並讓你的UI手工操作(因爲我懷疑你已經知道了)。

http://www.dotnetperls.com/backgroundworker

下面是關於如何使用後臺工作人員來處理線程池的一個例子老,但出色的鏈路。

這樣,您可以創建一個工作人員來管理在單獨的線程上運行轉換過程,我相信甚至有創建過程欄的例子。