Подождите, пока метод не будет выполнен внутри backgroundworker c # - PullRequest
0 голосов
/ 06 мая 2018

Я действительно новичок в программировании, и у меня очень мало знаний. Я сейчас нахожусь в плохой ситуации. У меня есть BackGroundWorker и Mehod. Я вызываю метод из события DoWork из BackGroundWorker. Проблема в том, что событие RunWorkerCompleted вызывается до выполнения метода:

string[] files;
private void BGW1_DoWorkAsync(object sender, DoWorkEventArgs e) {
    populate();
}

private void populate() {
    files = GetFiles(@"C:\filesystem"); ///100 files here
}

private void BGW1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
    foreach(string filename in files) {

    }
}

В цикле внутри события RunWorkerCompleted я иногда получаю сообщения об ошибках типа Collection was modified, а иногда он возвращает имена файлов, но не все из них (возможно, из-за того, что метод populate не завершился полностью?)

Итак, есть ли способ ждать, пока метод не будет выполнен полностью / полностью? Я слышал об Async / Await, но я не знаю, как использовать его в моем конкретном случае. Любая помощь будет оценена :)

1 Ответ

0 голосов
/ 06 мая 2018

Попробуйте использовать событие AutoResetEvent вместе с BackgroundWorker.

class Program
{
    private static BackgroundWorker worker = new System.ComponentModel.BackgroundWorker();
    private static AutoResetEvent resetEvent = new AutoResetEvent(false);
    private string[] files;
    static void Main(string[] args)
    {
        worker.DoWork += worker_DoWork;
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
        worker.ProgressChanged += worker_ProgressChanged;
        worker.WorkerReportsProgress = true;

        Console.WriteLine("Starting Application...");

        worker.RunWorkerAsync();
        resetEvent.WaitOne();

        Console.ReadKey();
    }

    static void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        Console.WriteLine(e.ProgressPercentage.ToString());
    }

    static void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        files = GetFiles(@"C:\filesystem"); ///100 files here

        resetEvent.Set();
    }

    static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        foreach(string filename in files) {

        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...