2012-02-27 2 views
0

Я хочу отобразить путь каждого файла при нажатии кнопки. То, что я сейчас это функция, которая перебирает папки и отображает пути, но только тогда, когда функция завершена:Добавить строки в список в WPF, используя C# в потоке

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); 
} 

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

ответ

1

Я не помню, где я наткнулся на этот кусок кода, но если вы измените метод 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

Он работает просто отлично :) но, как вы сказали, проблемы могут быть точными .. Может ли кто-нибудь сказать мне, какие проблемы могут быть и как я могу это исправить? –

+0

Я буду делать это, пока кто-то не кричит на меня :) Спасибо за фрагмент кода! –

+0

Как остановить поток после его запуска? Или прекратить поток? –

0

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

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); 
    })); 
} 
+0

Попробовал ваш пример, но я получаю эту ошибку: «Делегирование конструктор в вызове с 0 аргументом (ы)». Пробовал это потом, но потом он делает то, что я не хочу: Dispather.Invoke (новое действие (delegate() {myListBox.Items.Add (путь);})); –

+0

ОК, плохо обновите свой ответ. Разве это не работает? – hcb

+0

Разве это не лямбда-выражение того, что я пробовал? Но не жаль, что это не сработало:/Все еще нужно подождать, пока функция не будет закончена. –

Смежные вопросы