Невозможно заставить индикатор выполнения работать с многопоточностью - PullRequest
0 голосов
/ 26 марта 2019

Проблема, с которой я столкнулся, связана с вызовом кросс-потоков для использования индикатора выполнения между различными потоками.У меня есть основная функция, которая генерирует форму с индикатором выполнения, эта функция вызывает другую функцию с Select, которая содержит вызов рекурсивной функции и Task.WaitAll для всех асинхронных.Чего я хочу добиться, так это прогрессирования шага индикатора выполнения каждый раз, когда завершается «корневая» рекурсия.

То, что я уже пробовал, это передать ProgressBar в качестве параметра в обоих вызовах, затем вызвать Informke PerformStep.Проблема в том, что похоже, что выполнение приостановлено, и если я фактически приостанавливаю VS из-за выполнения, я замечаю, что поток застрял в этой строке.

private someArray; //this is not relevant

private void mainFunction(){
    Form f=new Form();
    ProgressBar p=new ProgressBar();
    loopFunction(p);
}

private void loopFunction(ProgressBar p){
    var tasks=someArray.Select(i => Task.Factory.StartNew(() => insideFunction(p)));
    Task.WaitAll(tasks.Cast<Task>().ToArray());
}

private void insideFunction(ProgressBar p){
   doSomething();
   p.Invoke(new Action()=>p.PerformStep());
}

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

Кто-нибудь, кто может найти ошибку?

Большое спасибо

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