2014-06-21 4 views
2

동적으로 여러 개의 타이머를 만들어야하지만 실행시 해당 타이머의 이름이 필요합니다.어떻게 동적으로 system.timer의 이름을 설정합니까?

여기 내 코드입니다 : 내가 timer.Site.Name에서 설정할 수 있다고 생각

 timersDict = new Dictionary<string, System.Timers.Timer>(); 
     int i = 0; 

     foreach (var msg in _messages.CurrentMessages) 
     { 
      var timer = new System.Timers.Timer(); 
      timer.Interval = int.Parse(msg.Seconds); 
      timer.Elapsed += Main_Tick; 
      timer.Site.Name = i.ToString(); 
      i++; 
     } 

하지만 사이트에 널 예외를 얻을.

만들고있는 타이머의 이름을 어떻게 설정합니까?

편집

나는 그것이 경과 이벤트에 도달 할 때 발사 무엇 타이머 알 필요가 있기 때문에 내가 이것을 만드는 오전. 나는 일단 그것이 발사되면 어떤 메시지를 표시해야하는지 알고 있어야합니다.

타이머를 사용하여 메시지를 전달하고 타이머를 기준으로 메시지를 표시 할 수 있습니까?

void Main_Tick(object sender, EventArgs e) 
    { 
     var index = int.Parse(((System.Timers.Timer)sender).Site.Name); 
     SubmitInput(_messages.CurrentMessages[index].MessageString); 
    } 

나는 그것이 내가 타이머의 모든 동적으로 생성되기 때문에 표시 어떤 메시지를 알 수 있도록이었다 타이머 말해 이름의 사용 거라고 : 여기

내 코드의 나머지 부분입니다.

+1

는 왜 이름이입니다 필요합니까 : 여기

은 예입니다? –

+0

사이트는 디자인 타임 속성이므로 런타임에 * null *이됩니다. 타이머를 * int *에 연결하려면''사전을 사용해야합니다. 그리고 for (;;) 루프 안에서'timersDict.Add (timer, i); '를 사용하십시오. –

+0

timer_tick 내부에서 어느 것이 발사되고 있는지 어떻게 알 수 있습니까? – ErocM

답변

2

System.Timers.Timer 클래스를 래핑하고 고유 한 이름 필드를 추가하는 것이 좋습니다.

using System; 
using System.Collections.Generic; 
using System.Threading; 

namespace StackOverFlowConsole3 
{ 

    public class NamedTimer : System.Timers.Timer 
    { 
     public readonly string name; 

     public NamedTimer(string name) 
     { 
     this.name = name; 
     } 
    } 

    class Program 
    { 
     static void Main() 
     { 
     for (int i = 1; i <= 10; i++) 
     { 
      var timer = new NamedTimer(i.ToString()); 
      timer.Interval = i * 1000; 
      timer.Elapsed += Main_Tick; 
      timer.AutoReset = false; 
      timer.Start(); 
     } 
     Thread.Sleep(11000); 
     } 

     static void Main_Tick(object sender, EventArgs args) 
     { 
     NamedTimer timer = sender as NamedTimer; 
     Console.WriteLine(timer.name); 
     } 
    } 
} 
+0

궁금한 점, 왜 거기에'thread.sleep'을 넣었습니까? – ErocM

+0

콘솔 응용 프로그램으로이 작업을 수행했기 때문에. 모든 타이머가 완료 될 때까지 주 스레드가 잠자기 상태가되어 제대로 작동한다는 것을 보여줍니다. 이를 제거하면 타이머가 작동하기 전에 응용 프로그램이 종료됩니다. – LVBen

+0

아! 도와 주셔서 감사합니다! 잘 했어! – ErocM

관련 문제