Использование Console.WriteLine в событии backgroundWorker doWork - PullRequest
4 голосов
/ 29 мая 2011

У меня есть консольное приложение, которое использует объект BackgroundWorker и хочет проверить мой вывод с помощью Console.WriteLine (fooBar). Однако это приложение завершается, когда приложение выполняет команду Console.WriteLine.

Вот разбавленная версия, которая иллюстрирует то, что я хотел сделать:

protected static void bWorker_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = startId; i <= endId; i++)
    {
        Console.WriteLine(i.ToString());
        Thread.Sleep(1000);
    }
}

Есть какие-нибудь идеи, почему приложение может выглядеть так?

Ответы [ 3 ]

5 голосов
/ 29 мая 2011

Приложение закрывается, потому что оно фактически завершает выполнение и больше не выполняет никакой работы ;-) После того, как вы запланируете фонового работника и запустите поток, чтобы выполнить свою задачу, вы должны указать основному потоку остановиться и ждать одно или другое. Очень распространенный способ сделать это (обычно используемый в тестовом / примерном коде) - просто ввести Console.ReadKey(); в качестве самой последней строки кода в вашем основном методе. Это заставит ваше приложение ждать, пока вы не нажмете клавишу, прежде чем выйти из процесса.

2 голосов
/ 29 мая 2011

Возможно, я неправильно понимаю ваши настройки.Я предполагаю, что вы запускаете фоновый поток, но основной процесс - это выход, который приводит к тому, что поток останавливается, прежде чем он что-то делает.Может быть, попробуйте добавить что-то в ваш основной процесс, чтобы предотвратить выход основного потока, например, Console.ReadKey ();

2 голосов
/ 29 мая 2011

Для вашего backgroundworker установите WorkerReportsProgress на true. Подписаться на ProgressChanged событие, как это:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    for (var i = 0; i < 1000; i++)
    {
        backgroundWorker1.ReportProgress(i);
    }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    Console.WriteLine(e.ProgressPercentage);
}

Если вам нужно перенести не только int из фонового потока в поток пользовательского интерфейса, то вы можете сделать что-то вроде этого:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    for (var i = 0; i < 1000; i++)
    {
        var myObjectInstance = new MyObject{ ...};
        backgroundWorker1.ReportProgress(null, myObjectInstance);
    }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    var myObjectInstance = (MyObject)e.UserState;
    Console.WriteLine(myObjectInstance);
}
...