C# Моргание при многопоточном рисовании элементов в WinForms
существует следующая проблема, при рисовании элементов, в отличном от главного потоке вызывается событие
EvNeedToRedraw?.Invoke();
По следующему делегату
public delegate void NeedToRedraw();
Подписывается на событие
EvNeedToRedraw += Redraw;
И обновляется PictureBox
void Redraw()
{
BattleField.Invalidate();
}
Если использовать
void Redraw()
{
BattleField.Refresh();
}
То вылетает следующая ошибка: System.InvalidOperationException: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'BattleField' не из того потока, в котором он был создан."
Но если использовать
void Redraw()
{
BattleField.Invalidate();
}
То возникает моргание, из-за того, что PictureBox обновился, но объекты ещё не отрисовались, или были отрисованны до обновления, т.е. дважды были отрисованны на на одно обновление PictureBox
Код рисования:
while (true)
{
g.Clear(Color.AntiqueWhite);
lock (ListObj)
{
foreach (var i in ListObj)
i.Draw(IsNeedToDraw);
for (int i = 0; i < ListObj.Count; i++)
if (ListObj[i].IsNeedToDestroy)
{
if (ListObj[i].GetType() == new PersonDrawTickImage().GetType())
((PersonDrawTickImage)ListObj[i]).InvokeEventForAddToDrawList(EvNeedToAddStaticPicture);
ListObj.RemoveAt(i);
}
}
Thread.Sleep(Pause);
EvNeedToRedraw?.Invoke();
if (Ticks == 1)
IsNeedToDraw = false;
else if(Ticks == MaxTicks)
{
Ticks = 0;
IsNeedToDraw = true;
}
Ticks++;
Мне нет нужды отрисовывать несколько объектов каждый тик, для этого необходим счётчик прошедших тиков
Буду благодарен, если объясните где ошибка и как избежать моргания(моргают только объекты, на всех пк)