可怕的嵌套计时器,如何重构? [英] Awful nested timers, how do I refactor?
本文介绍了可怕的嵌套计时器,如何重构?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
//三部分动画
public void SetPlayerAnimation (int location,int x1,int y1,TimeSpan duration1,string sprite1,int x2,int y2,TimeSpan duration2,string sprite2,int x3,int y3,TimeSpan duration3,string sprite3,string endsprite)
{
//获取sprite对象动画
TranslateTarget =Sprite+ location.ToString();
OnPropertyChanged(TranslateTarget);
//开始第一部分
RunAnimation(location,x1,y1,duration1,sprite1);
var timer = new DispatcherTimer();
timer.Interval = duration1;
timer.Start();
timer.Tick + =(s,args)=>
{
//开始第二部分
RunAnimation(location,x2,y2,duration2,sprite2);
timer.Stop();
var timer2 = new DispatcherTimer();
timer2.Interval = duration2;
timer2.Start();
timer2.Tick + =(s2,args2)=>
{
//开始第三部分
RunAnimation(location,x3,y3,duration3,sprite3);
timer2.Stop();
var timer3 = new DispatcherTimer();
timer3.Interval = duration2;
timer3.Start();
timer3.Tick + =(s3,args3)=>
{
//结束与最后的精灵
SetPlayerSprite(location,endsprite);
timer3.Stop();
};
};
};
}
解决方案
使用async / await和all你的麻烦消失了!
public void SetPlayerAnimation(int location,int x1,int y1,TimeSpan duration1,string sprite1,int x2 ,int y2,TimeSpan duration2,string sprite2,int x3,int y3,TimeSpan duration3,string sprite3,string endsprite)
{
//获取要动画的sprite对象
TranslateTarget = Sprite+ location.ToString();
OnPropertyChanged(TranslateTarget);
Task.Factory.StartNew(
async()=> {
RunAnimation(location,x1,y1,duration1,sprite1);
等待Task.Delay(duration1);
RunAnimation(location,x2,y2,duration2,sprite2);
await Task.Delay(duration2);
RunAnimation(location,x3,y3,duration3,sprite3);
等待Task.Delay(duration2);
SetPlayerSprite(location,endsprite);
},//这将使用当前同步上下文
CancellationToken.None,
TaskCreationOptions没有,
TaskScheduler.FromCurrentSynchronizationContext());
}
I've a method consisting of an ugly 13 parameters, but I can't figure out how to turn these into proper submethods and still function exactly the same, stopping after three iterations, using the correct parameters, closing off with a different method, etc. Would someone help me in the right direction?
//Three part animation
public void SetPlayerAnimation(int location, int x1, int y1, TimeSpan duration1, string sprite1, int x2, int y2, TimeSpan duration2, string sprite2, int x3, int y3, TimeSpan duration3, string sprite3, string endsprite)
{
//Get the sprite object to be animated
TranslateTarget = "Sprite" + location.ToString();
OnPropertyChanged("TranslateTarget");
//Start first part
RunAnimation(location, x1, y1, duration1, sprite1);
var timer = new DispatcherTimer();
timer.Interval = duration1;
timer.Start();
timer.Tick += (s, args) =>
{
//Start second part
RunAnimation(location, x2, y2, duration2, sprite2);
timer.Stop();
var timer2 = new DispatcherTimer();
timer2.Interval = duration2;
timer2.Start();
timer2.Tick += (s2, args2) =>
{
//Start third part
RunAnimation(location, x3, y3, duration3, sprite3);
timer2.Stop();
var timer3 = new DispatcherTimer();
timer3.Interval = duration2;
timer3.Start();
timer3.Tick += (s3, args3) =>
{
//End with a final sprite
SetPlayerSprite(location, endsprite);
timer3.Stop();
};
};
};
}
解决方案
Use async/await and all your troubles go away!
public void SetPlayerAnimation(int location, int x1, int y1, TimeSpan duration1, string sprite1, int x2, int y2, TimeSpan duration2, string sprite2, int x3, int y3, TimeSpan duration3, string sprite3, string endsprite)
{
//Get the sprite object to be animated
TranslateTarget = "Sprite" + location.ToString();
OnPropertyChanged("TranslateTarget");
Task.Factory.StartNew(
async () => {
RunAnimation(location, x1, y1, duration1, sprite1);
await Task.Delay(duration1);
RunAnimation(location, x2, y2, duration2, sprite2);
await Task.Delay(duration2);
RunAnimation(location, x3, y3, duration3, sprite3);
await Task.Delay(duration2);
SetPlayerSprite(location, endsprite);
}, // this will use current synchronization context
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext());
}
这篇关于可怕的嵌套计时器,如何重构?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文