2015-05-21 2 views
1

У нас такая ситуация. У нас есть холст, на котором изображено некоторое количество фигур. Это может быть один или несколько больше (например, тысяч) и нам нужно анимировать их перевод в другое место (на кнопку мыши) с помощью раскадровки:Асинхронный метод вызова в C#

internal void someStoryBoard(figure someFigure, double coordMoveToValue) 
{ 
    string sbName = "StoryBoard_" + figure.ID; 
    string regName = "figure_" + figure.ID; 
    try 
    { 
     cnvsGame.Resources.Remove(sbName); 
     cnvsGame.UnregisterName(regName); 
    } 
    catch{ } 
     someCanvas.RegisterName(regName, someFigure.Geometry); 
     var moveFigureYAnimation = new PointAnimation(); 
     moveFigureYAnimation.From = new Point(someFigure.Geometry.Center.X, someFigure.Geometry.Center.Y); 
     moveFigureYAnimation.To = new Point(someFigure.eGeometry.Center.X, coordMoveToValue); 
     moveFigureYAnimation.Duration = TimeSpan.FromSeconds(0.5); 
     var sbFigureMove = new Storyboard(); 
     Storyboard.SetTargetName(sbFigureMove, regName); 
     Storyboard.SetTargetProperty(sbFigureMove, new PropertyPath(Geometry.CenterProperty)); 
     sbFigureMove.Children.Add(moveFigureYAnimation); 
     cnvsGame.Resources.Add(sbName, sbFigureMove); 
     sbFigureMove.Begin();   
    } 

Цифры сохраняются в списке. Мы называем это раскадровке, используя цикл:

for(int i = 0; i<listOfFigures.Count; i++) 
    { 
     someStoryBoard(listOfFigures[i], someCoord); 
    } 

Но вот проблема: если у нас есть небольшое количество цифр - код завершения быстро. Но если объем большой - есть задержка после нажатия кнопки и до того, как цифры начнут двигаться. Итак, вот вопрос: можно ли асинхронно вызывать метод someStoryBoard? Возможный следующий алгоритм -> Когда вызывается someStoryBoard, он начинает мгновенно перемещать фигуру, не дожидаясь завершения цикла for.

ответ

1

Вы можете добавлять действия в очередь диспетчера, вызывая Dispatcher.InvokeAsync. Вы также можете указать приоритет диспетчера, в зависимости от ваших требований.

Обратите внимание, что перемещение тысяч предметов не может быть надежно быстрым, поэтому вам может потребоваться переосмыслить логику рисования. Если даже стартовая анимация медленная, очень вероятно анимация тоже не будет достаточно быстрой.

1

Вы можете попробовать использовать асинхра/ждать Изменявшего

async internal Task someStoryBoard(figure someFigure, double coordMoveToValue) 
Смежные вопросы