2016-01-12 4 views
0

У меня есть рабочий рабочий фон в моем приложении, который предназначен для автоматического запуска сеанса пользователя, если его еще нет.C# BackgroundWorker Неожиданно выходит

Это делается на фоне работника (backgroundInit) при инициализации. Как вы можете видеть ниже, у меня есть while цикл, который продолжает работать до тех пор, как вар checker остается ложным:

var checker = false; 
var i = 0; 
while (checker == false) 
{ 
    _session = funcs.GetSession(_servers, _name); 
    _sessID = _session[0].Trim(); 
    _servName = _session[1]; 

    checker = funcs.CheckRunning("lync.exe"); 
    i++; 

    if (i > 200) 
    { 
     break; 
    } 
} 

Метод CheckRunning просто проверяет, если указанная программа (в данном случае, «Lync») является в настоящее время работает и возвращает true или false соответственно (это делается с помощью команды CMD).

Однако, когда я запускаю приложение на пустой сессии, цикл while повторяется только один раз до выхода, хотя «Lync» определенно не работает.

Есть ли причина, по которой запуск процесса или слишком много процессов из фонового работника может привести к его завершению?

+1

Так 'checker' является' false' после 'checker = funcs.CheckRunning (" lync.exe ");'? Если это так, этот вопрос не имеет смысла, поскольку «BackgroundWorker» выходит ** ожидаемо **, и проблема - это функция, которая проверяет ваш процесс. В противном случае вам нужно быть более явным, есть ли какое-либо исключение? Вы пробовали пошаговую отладку? – Jcl

+1

Может быть, какое-то исключение бросили? Например. ваш 'GetSession' возвращает пустой или пустой массив. – Nikita

+1

while (! Funcs.CheckRunning ("lync.exe")) было бы проще прочитать. И переименуйте в IsRunning. –

ответ

0

Как отмечалось в комментариях, это не было проблемой с BackgroundWorker, а скорее исключением в _sessID = session[0].Trim();, где сеанс еще не начался, поэтому идентификатор отсутствует.

Чтобы решить эту проблему, я просто разместил Try/Catch блок вокруг этого задания, и пусть программа молча игнорировать исключение:

try 
    { 
     _sessID = _session[0].Trim(); 
     _servName = _session[1]; 
    } 
    catch (Exception exp) 
    { 
     // MessageBox.Show(exp.Message); 
    } 

Это работает для меня, так как цикл будет продолжать проверку, пока счетчик i достигает предел 200, на каком этапе программа будет принимать отказ.

+0

Это не идеальное решение, но пока это будет сделано. В конце концов весь этот код нужно будет реорганизовать. – Bassie

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