可怕的嵌套计时器,如何重构? [英] Awful nested timers, how do I refactor?

查看:167
本文介绍了可怕的嵌套计时器,如何重构?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个方法包含一个丑陋的13个参数,但是我无法弄清楚如何将它们转换成正确的子方法,并且仍然运行完全相同,在三次迭代后停止,使用正确的参数,关闭一个不同的方法等有人可以帮助我正确的方向吗?

  //三部分动画
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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆