更新ui线程

时间:2012-03-06 19:43:36

标签: c# winforms

我有一个ListBox我放了一些文件,如果文件不是AVI我自动转换它但我想当文件转换消息将写在标签上文件现在转换为另一种格式,我知道我需要使用Dispatcher来更新UI线程,但我现在使用Winform而不是WPF,我需要帮助。 BTW我不能使用Task因为我使用.Net 3.5

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...";

        }

3 个答案:

答案 0 :(得分:2)

从您的问题来看,您似乎想要转换多个文件。您可能需要考虑使用BackgroundWorker类并覆盖this article中所述的DoWork和ProgressChanged事件。您可以更新ProgressChanged事件中的标签和其他控件。

答案 1 :(得分:0)

这是长时间运行流程的一个非常常见的要求。如果你没有在一个单独的线程上显式调用方法,它们将自动在main(参见:UI)线程上运行并导致你的UI交出(我怀疑你已经知道)。

http://www.dotnetperls.com/backgroundworker

这是一个旧的但非常好的链接,其中有一个示例,介绍如何使用后台工作程序为您处理线程池。

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

答案 2 :(得分:0)

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

 ....
}