for (do it a bunch of times)
{
while (backgroundWorker1.IsBusy && backgroundWorker2.IsBusy &&
backgroundWorker3.IsBusy && backgroundWorker4.IsBusy &&
backgroundWorker5.IsBusy)
{
System.Threading.Thread.Sleep(0001);
}
if (!backgroundWorker1.IsBusy)
{
backgroundWorker1.RunWorkerAsync();
}
else if (!backgroundWorker2.IsBusy)
{
backgroundWorker2.RunWorkerAsync();
}
else if (!backgroundWorker3.IsBusy)
{
backgroundWorker3.RunWorkerAsync();
}
else if (!backgroundWorker4.IsBusy)
{
backgroundWorker4.RunWorkerAsync();
}
else if (!backgroundWorker5.IsBusy)
{
backgroundWorker5.RunWorkerAsync();
}
}
он запускается пять раз (каждый BG-работник один раз) и застревает. Разве фоновые работники не перестают быть занятыми? как проверить доступность?
примечание: есть 5 рабочих потоков, это гарантирует, что ни один из них никогда не останавливается, всегда назначая им работу. Но они отказываются сообщать мне, когда они доступны, я подумал, что было бы простое решение ..
- [запрос на редактирование] ---
На самом деле это был всего лишь фиктивный параметр, я удалил его и забыл вытащить его, я использую его только для вызова придворного, который выполняет грязную работу:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
timeconsumingfunction(publicstring);
}
И функция, отнимающая много времени, заканчивается. входя в него в отладчике и выполняя строку за строкой, он доходит до конца и попадает в финальный символ '}'. Это означает, что это заканчивается, верно?
--- [РЕДАКТИРОВАТЬ ОТВЕТ] ----
это сработало просто заменив строку
System.Threading.Thread.Sleep(0001);
с
Application.DoEvents();
Полагаю, он запустит фон, но не получит ответ и не обновит теги IsBusy.
Спасибо всем, отличные ответы, очень помогли!