У меня есть элемент управления PictureBox на форме, который должен рисовать что-то каждые 100 мс.
Фоновый поток выполняет некоторые вычисления в цикле и после каждой итерации запускает событие.
Отредактировано (в ответ на комментарий) :
World world = new World();
void CreateBackgroundThread() {
Thread backgroundThread = new Thread(world.BackgroundWorkerFunction);
backgroundThread.Start();
}
public class World {
void BackgroundWorkerFunction() {
IPiece piece = PieceFactory.Create();
for (int i = 0; i < stepsCount; i++) {
piece.Calculate();
if (OnPieceStep != null) {
OnPieceStep(piece);
}
}
}
}
Внутри основной формы есть обработчик, установленный:
world.OnPieceStep += DrawScreen;
и обертка Invoke (поскольку элемент управления, к которому следует обращаться, создается в потоке пользовательского интерфейса).
void DrawScreen(IPiece piece) {
this.Invoke(new PieceStep(_drawScreen), piece);
}
void _drawScreen(IPiece piece) {
drawer.Draw(world.Board, piece);
}
Теперь я бы хотел, чтобы for loop приостанавливал 100 мс после каждой итерации, поэтому я добавил Thread.Sleep (100); перед запуском события:
for (int i = 0; i < stepsCount; i++) {
IPiece piece = Calculate();
if (OnPieceStep != null) {
Thread.Sleep(100);
OnPieceStep(piece);
}
}
Это, однако, не обновляет pictureBox каждые 100 мс, но рисует только последнюю итерацию цикла и только после его завершения.
Не должен ли Thread.Sleep приостановить поток, в котором он вызывается, а не поток пользовательского интерфейса?
Обновление: Я только что попытался нажать на приложение, пока вычисляется фоновая нить. Программа блокируется («не отвечает»), поэтому Thread.Sleep явно вызывался в потоке пользовательского интерфейса. Это ожидаемое поведение или что-то не так с моим потоком?