Как я могу позволить потоку пользовательского интерфейса выполнить команду, когда я в каком-то потоке - PullRequest
1 голос
/ 08 февраля 2012

как мне разрешить UIthread выполнить команду, когда я в каком-то потоке приведенный ниже код вызывается потоком, но строка, которую я хочу запустить в UIthread .. не работает, если я назвал это так ..
форма немного запаздывает, и вентилятор процесса становится быстрым, как будто он находится в бесконечном цикле ... тогда он выдает мне ошибку "stackoverflowexception"

мое приложение является файловым менеджером .. (копировать, вырезать, вставить, новую папку .. и т. Д.) .. и dirRecursive (путь к строке) .. показывает мне файлы и папки в виде списка со значками , поэтому каждый раз, когда я делаю что-то вроде (новая папка или вставка), мне нужно вызывать 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
        }
    }

1 Ответ

2 голосов
/ 08 февраля 2012

попробуйте заменить эту строку

dirRecursive(currAddress);

на

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

Это предполагает, что вы используете WinForms, а не WPF, вы не указали.Также «InvokeRequired» и «Invoke» являются членами System.Windows.Forms.Control, поэтому ваш PasteFromCopy должен быть методом в вашей форме.

...