首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更新ui线程

更新ui线程
EN

Stack Overflow用户
提问于 2012-03-07 03:43:36
回答 3查看 400关注 0票数 1

我有一个ListBox,我把一些文件,如果文件不是AVI我自动转换它,但我想当文件转换消息将写在标签上的文件现在被转换为另一种格式,我知道我需要使用调度程序来更新UI线程,但我现在使用Winform而不是WPF,我需要这方面的帮助。顺便说一下,我无法使用任务,因为我使用的是.Net 3.5

代码语言:javascript
运行
复制
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);
        }
    }
}

此函数需要更改标签:

代码语言:javascript
运行
复制
        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...";

        }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-07 03:56:23

代码语言:javascript
运行
复制
public void sendFilesToConvertToPcap()
{
   .....
   ....
   this.Invoke((MethodInvoker)delegate {
   lblStatus2.Text = "Convert file to .AVI..."; });

 ....
}
票数 0
EN

Stack Overflow用户

发布于 2012-03-07 03:54:30

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

票数 2
EN

Stack Overflow用户

发布于 2012-03-07 03:55:06

对于长时间运行的流程来说,这是一个非常常见的需求。如果你不在单独的线程上显式调用方法,它们将自动在主线程(参见: UI)上运行,并导致你的UI手动(我猜你已经知道了)。

http://www.dotnetperls.com/backgroundworker

这里有一个古老但很好的链接,其中有一个关于如何使用后台工作程序为您处理线程池的示例。

这样,您就可以创建一个worker来管理在单独线程上运行的转换进程,我相信甚至还有一个创建进程栏的示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9590702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档