2012-03-06 131 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

下面是关于如何使用后台工作人员来处理线程池的一个例子老,但出色的链路。

这样,您可以创建一个工作人员来管理在单独的线程上运行转换过程,我相信甚至有创建过程栏的例子。