2014-02-05 1 views
1

C#의 timer_tick 이벤트에 일부 매개 변수를 전달하려고하지만 전역 변수를 만들고 싶지 않습니다. 이것이 가능한가?timer_Tick 이벤트에 매개 변수 전달

나는 모양의 라운드를했고,이 같은 내놓았다 :

//Where I start the timer 
lift1Up.Enabled = true; 
lift1Up.Tick += (sender, args) => lift1Up_Tick(sender, args, destination, currentFloor); 
lift1Up.Start(); 

private void lift1Up_Tick(object sender, EventArgs e, int dest, int current) 
{ 
    //my code  
} 

많은 감사합니다! 누가.

답변

1

예, 그렇지만 그렇게 좋지는 않습니다.

lift1Up_Tick(this, new MyEventArgs { dest = 23, current = 100 }); 

그리고 틱 이벤트에 당신이 얻을 수있는이 인수 :

을 당신은 그럼 당신은 수동으로 Tick 이벤트를 트리거와 같은 매개 변수를 전달해야 EventArgs

class MyEventArgs : EventArgs 
{ 
    public int dest { get; set; } 
    public int current { get; set; } 
} 

에서 상속하여 클래스를 정의 할 수 있습니다

private void lift1Up_Tick(object sender, EventArgs e) 
{ 
    var args = (MyEventArgs)e; 
    int dest = args.dest;  
} 

더 좋은 방법이 있는지 모르겠습니다.이 작업을 수행하려면 다른 타이머를 추가하십시오. 간격을두고이 코드를 틱으로 작성하십시오. 이벤트 : 언급 된 예에서 사용 된

lift1Up_Tick(this, new MyEventArgs { dest = 23, current = 100 }); 
+0

은, 대단히 감사합니다. 누가. – user3277329

0

예, 당신은 람다 기능을 사용할 수 있습니다. 람다 함수는 포함 함수의 범위에서 변수에 대한 액세스를 허용한다는 점에서 중첩 함수의 한 형태입니다.

(input parameters) => expression; 
(input parameters) => {statement block}; 

그래서, 당신이 그들을 전역 변수를 만들 필요없이, 이벤트 변수를 포함하는 범위의 모든 변수의 가시성, 호출 방법처럼, 어떤 식 또는 문 블록을 실행할 수 있습니다 람다 식으로 정의된다.

1

당신은 당신의 이벤트 처리기에 대한 람다를 사용하고, 거기에서 지역 변수에 액세스 할 수 있습니다, C# 컴파일러는 마법을 수행합니다

좋은 작품
void StartTimer() 
{ 
    EventHandler tickHandler = null; 

    var destination = 5, currentFloor = 0; 

    tickHandler = (sender, args) => 
    { 
     if (currentFloor == destination) 
     { 
      lift1Up.Enabled = false; 
      lift1Up.Tick -= tickHandler; 

      MessageBox.Show("Arrived!"); 
     } 
     else 
      currentFloor++; 
    } 

    // start the timer 
    lift1Up.Tick += tickHandler; 
    lift1Up.Enabled = true; 
}