Скажите, что ниже ваш класс отвечает за работу с циклом в нем. Добавьте событие, чтобы указать ваш прогресс. Затем из вашего пользовательского интерфейса просто обработайте это событие и соответствующим образом обновите индикатор выполнения.
sealed class Looper
{
public event EventHandler ProgressUpdated;
private int _progress;
public int Progress
{
get { return _progress; }
private set
{
_progress = value;
OnProgressUpdated();
}
}
public void DoLoop()
{
_progress = 0;
for (int i = 0; i < 100; ++i)
{
Thread.Sleep(100);
Progress = i;
}
}
private void OnProgressUpdated()
{
EventHandler handler = ProgressUpdated;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
Вы можете реализовать это, имея BackgroundWorker
как часть вашего пользовательского интерфейса, где в событии backgroundWorker.DoWork
вы вызываете looper.DoLoop()
. Затем в обработчике события looper.ProgressUpdated
вы можете вызвать backgroundWorker.ReportProgress
, чтобы увеличить индикатор выполнения из потока пользовательского интерфейса.
Обратите внимание, что, вероятно, было бы более разумно включить сам прогресс в информацию, переносимую вашим событием ProgressUpdated
(мне просто не хотелось писать новый класс, производный от EventArgs
, чтобы проиллюстрировать это; вы, вероятно, в любом случае получить изображение).
Также обратите внимание, что вышеприведенное действительно не имеет смысла, если вы не выполняете свой код с циклом в отдельном потоке от потока пользовательского интерфейса. В противном случае вся ваша работа будет завершена до следующего обновления пользовательского интерфейса, поэтому ваш индикатор выполнения не будет предоставлять никакого значения (он просто изменится с 0 до 100, когда цикл завершится).
Просто пример того, как такого рода вещи могут быть достигнуты.