我在一些线程中如何让UI线程执行命令

时间:2012-02-08 01:26:31

标签: c# multithreading ui-thread

当我在某个线程中时,如何让UIthread执行命令 下面的代码由一个线程调用,但我想在UIthread中运行的行...如果我这样调用它就不起作用..
形式滞后一点,进程风扇变得像在无限循环中一样快...然后它给了我一个错误“stackoverflowexception”

我的应用程序是文件管理器..(复制,剪切,粘贴,新文件夹......等)..和 dirRecursive(字符串路径) ..显示listView中的文件和文件夹带有图标所以每当我做(新文件夹或粘贴)这样的事情时,我都必须调用 dirRecursive 来更新listView

注意:

  • 在尝试用线程执行 PasteFromCopy 之前,它的效果很好..
  • 当我从粘贴方法中删除 dirRecursive(..)行时,它的效果非常好..但我需要在粘贴后自动更新 listview 完成..为什么我必须从 PasteFromCopy 调用它,但使用UIThread
  • 如果我使用UIThread进行PASTE,那么当文件被复制时表单会滞后..你知道

    请帮助:)提前感谢

    private void PasteFromCopy(object dest)
        {
            foreach (ListViewItem item in copiedItems)
            {
                string _dest = (string)dest;
                string itemName = item.Text;
                string itemPath = item.ToolTipText;
                string itemDest = Path.Combine(_dest, itemName);
                if (IsFolder(itemPath))
                {
                    if (Directory.Exists(itemDest))
                    {
                        if (MessageBox.Show(itemName + " is already exists .. Do you want to overwrite it and its all contents?"
                            , "Overwrite", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk) == DialogResult.OK)
                        {
                            CopyDirectory(itemPath, itemDest, true);
                        }
                    }
                    else
                        CopyDirectory(itemPath, itemDest, false);
                }
                else
                {
                    if (File.Exists(itemDest))
                    {
                        if (MessageBox.Show(itemName + " is already exists .. Do you want to overwrite it?"
                        , "Overwrite", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk) == DialogResult.OK)
                        {
                            InfoLabel("Copying " + itemName + " ...");
                            File.Copy(itemPath, itemDest, true);
                        }
                    }
                    else
                    {
                        InfoLabel("Copying " + itemName + " ...");
                        File.Copy(itemPath, itemDest, false);
                    }
                }
                InfoLabel("Paste done.");
    
                dirRecursive(currAddress);   // here is line i need to execute from UIthread
            }
        }
    
  • 1 个答案:

    答案 0 :(得分:2)

    尝试替换此行

    dirRecursive(currAddress);
    

    if (InvokeRequired)
    {
        Action a = ()=>dirRecursive(currAddress);
        Invoke(a);
    }
    

    这假设你使用的是WinForms而不是WPF,你还没有指定。另外' InvokeRequired'并且'调用'都是System.Windows.Forms.Control的成员,因此您的PasteFromCopy需要是表单上的方法。