1

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

我的应用程序是一个文件管理器..(复制,剪切,粘贴,新文件夹..etc)..和dirRecursive(字符串路径) ..向我显示listView中的文件和文件夹及其图标,所以每次我做类似的事情(新文件夹或粘贴)我必须调用dirRecursive来更新 listView

笔记:

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

    请帮助:)提前谢谢

    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
            }
        }
    
  • 4

    1 回答 1

    2

    尝试替换此行

    dirRecursive(currAddress);
    

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

    这是假设您使用的是 WinForms 而不是 WPF,您尚未指定。此外,“InvokeRequired”和“Invoke”都是 System.Windows.Forms.Control 的成员,因此您的 PasteFromCopy 需要成为表单上的一种方法。

    于 2012-02-08T01:51:49.940 回答