Добавить строки в список в WPF, используя C # в потоке - PullRequest
0 голосов
/ 27 февраля 2012

Я хочу отобразить путь каждого файла при нажатии кнопки. Сейчас у меня есть функция, которая перебирает папку и отображает пути, но только после завершения функции:

public void ProcessDirectory(string targetDirectory)
{
    // Process the list of files found in the directory.
    try
    {
        var fileEntries = Directory.GetFiles(targetDirectory);

        foreach (var fileName in fileEntries)
        {
            ProcessFile(fileName);
        }
    }
    catch (Exception e){}
    // Recurse into subdirectories of this directory.
    try
    {
        var subdirectoryEntries = Directory.GetDirectories(targetDirectory);

        foreach (string subdirectory in subdirectoryEntries)
            ProcessDirectory(subdirectory);
    }
    catch (Exception e){}
}


public void ProcessFile(string path)
{
    myListBox.Items.Add(path);  
}

Это значит, что мне нужно подождать, прежде чем я смогу заняться чем-то другим. Как я могу отобразить путь к файлу мгновенно, когда функция запущена, поэтому мне не нужно ждать, пока функция будет завершена, получая все пути перед отображением в списке?

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Я не помню, где я натолкнулся на этот фрагмент кода, но если вы измените свой метод ProcessFile на что-то подобное, он обновит ваш интерфейс после добавления каждого элемента в ваш список.

public void ProcessFile(string path)
{
    myListBox.Items.Add(path);
    myListBox.ScrollIntoView(myListBox.Items[myListBox.Items.Count-1]);
    Dispatcher.Invoke(new Action(delegate { }), DispatcherPriority.Background);
}

Мне кажется, я помню, что читал где-то, что этот «взлом» не рекомендуется из-за ряда других проблем, которые могут возникнуть, но я не могу вспомнить, что это было и где я читал.Это делает работу однако.

Может быть, кто-то еще может рассказать нам о том, что это за проблемы ...

0 голосов
/ 27 февраля 2012

Это заставляет ваш метод работать в другом потоке:

public void StartProcessThread(string targetDirectory)
{
    Thread T = new Thread(new ParameterizedThreadStart(ProcessDirectory));

    T.Start(targetDirectory);
}

public void ProcessDirectory(object objTargetDirectory)
{
    string targetDirectory = (string)objTargetDirectory;

    // Process the list of files found in the directory.
    try
    {
        var fileEntries = Directory.GetFiles(targetDirectory);

        foreach (var fileName in fileEntries)
        {
            ProcessFile(fileName);
        }
    }
    catch (Exception e){}
    // Recurse into subdirectories of this directory.
    try
    {
        var subdirectoryEntries = Directory.GetDirectories(targetDirectory);

        foreach (string subdirectory in subdirectoryEntries)
            ProcessDirectory(subdirectory);
    }
    catch (Exception e){}
}


public void ProcessFile(string path)
{
    Dispatcher.Invoke(new Action(() => {
        myListBox.Items.Add(path);  
    }));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...