[英]Asynchronous method call in C#
我们有这种情况。 我们有一个画布,上面绘制了一些数字。 可能是1个或更多(例如1000个),我们需要使用情节提要将其翻译动画化到另一个位置(单击按钮):
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循环调用此StoryBoard:
for(int i = 0; i<listOfFigures.Count; i++)
{
someStoryBoard(listOfFigures[i], someCoord);
}
但这就是问题所在:如果我们只有少量数字,那么代码会很快完成。 但是,如果数量很大,则在单击按钮之后以及图形开始移动之前会有一个延迟。 因此,这是一个问题:是否可以异步调用someStoryBoard方法? 下一个算法是否可能->当调用someStoryBoard时,它立即开始移动图形,而不是等待整个for循环完成。
您可以通过调用Dispatcher.InvokeAsync
将操作添加到Dispatcher队列中。 您还可以根据需要指定调度程序优先级。
请注意,移动数以千计的项目并不能可靠地快速完成,因此您可能需要重新考虑绘图逻辑。 如果甚至开始的动画很慢, 动画也很可能不够快。
您可以尝试使用异步/等待修饰符
async internal Task someStoryBoard(figure someFigure, double coordMoveToValue)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.