2010-05-24 7 views
17

저는 매 20 초마다 매개 변수를 전달하는 메서드를 호출하고 싶습니다. 예 : . public void ProcessPerson (IPerson person)매 20 초마다 메서드를 호출하는 가장 효율적인 방법은 무엇입니까

나는 다른 타이머 옵션을 읽고 있었으며 누구나 가장 효율적인 방법을 추천 할 수 있는지 궁금해하고 있었습니까?

또한 오브젝트를 사용하기보다는 강력한 형식의 매개 변수를 유지 한 다음 IPerson으로 변환해야합니까?

도움 주셔서 감사합니다.

+0

궁금한 점이 있지만 궁금한 점이 있습니다.하지만 수신 한 순간에 각 사람을 처리 할 수있을 때마다 한 사람을 20 초마다 처리하는 이유는 무엇입니까? – Juliet

+1

예를 들어, 아마 어색한 것입니다. :) 실제로 관심있는 ns마다 강력한 형식의 매개 변수로 메서드를 호출하는 방법입니다. – CiaraM

답변

4

나는 System.Threading.Timer으로 갈 것이다. Windows는 실시간 OS 시스템이 아니므로 어떤 메커니즘을 선택하든 타이밍에 차이가있을 수 있습니다.

이 기능이 어떤 종류의 UI 업데이트를 수행하는지는 말하지 않았지만, 콜백 기능이 다른 스레드에서 실행된다는 것을 알고 있어야하는 경우 UI 업데이트를 수행해야하는 경우와 같이 다시 UI 스레드로 요청을 마샬링하는 적절한 조치를 취합니다.

다시 UI에 요청을 마샬링 Control.Invoke

WPF를 들어 당신이 Dispatcher.Invoke

또는 비동기 변형 BeginInvoke

23
을 사용할 수 있습니다 사용할 수있는 당신이 윈폼은 다음

을 할 수있는 스레드

System.Threading.Timer은 다음과 같습니다.

지정된 간격으로 메소드를 실행하는 메커니즘을 제공합니다.

TimerCallback 대리자를 사용하여 타이머에서 실행할 메서드를 지정합니다. 타이머 델리게이트는 타이머가 구성 될 때 지정되며 변경할 수 없습니다. 메서드는 타이머를 만든 스레드에서 실행되지 않습니다. 시스템이 제공하는 ThreadPool 스레드에서 실행됩니다.

또한 System.Windows.Forms.Timer있다 :

사용자 정의 간격으로 이벤트를 발생시키는 타이머를 구현합니다. 이 타이머는 Windows Forms 응용 프로그램에서 사용하도록 최적화되어 있으므로 창에서 사용해야합니다.

이 Windows 타이머는 처리를 수행하는 데 UI 스레드가 사용되는 단일 스레드 환경을 위해 설계되었습니다.

그리고 System.Timers.Timer을 잊지 마세요 :

타이머 구성 요소는이 경과 이벤트가 응용 프로그램에서 제기되는 반복 간격을 지정할 수있는 서버 기반 타이머입니다.

서버 기반 Timer는 다중 스레드 환경에서 작업자 스레드와 함께 사용하도록 설계되었습니다. 서버 타이머는 발생 된 Elapsed 이벤트를 처리하기 위해 스레드간에 이동할 수 있으므로 Windows 타이머가 이벤트를 제때에 발생시키는 것보다 더 정확합니다.

각각을 조사하여 어떤 경우에 가장 적합한 지 결정하십시오.

+4

Windows Forms를 사용하는 경우 System.Windows.Forms.Timer UI 스레드에서 콜백이 발생하는 더 나은 옵션입니다. –

+0

@ 페 타르 - 그 덕분에, 나는 둘 다 커버 답변을 업데이 트했습니다. – ChrisF

+0

System.Timers.Timer도 있습니다. 어쩌면 당신은 완성을 위해 당신의 대답에 그것을 추가 할 수 있습니까? –

0

이 작업을 수행 할 수 있습니다. 수행중인 작업이 스레드로부터 안전한지 확인하십시오.


using System.Threading; 

public void DoStuff(IPerson person) 
{ 
    new Timer(ProcessPerson, person, 0, 20000); 
} 

public void ProcessPerson(object threadState) 
{ 
    IPerson person = threadState as IPerson; 
    // do your stuff 
} 
+0

[3 클래스] (http : // msdn.microsoft.com/en-us/magazine/cc164015.aspx) .net 프레임 워크에서 '타이머'라는. 어떤 이야기하고 있는지 분명히해야합니다. (나는 당신이 [System.Threading.Timer] (http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx)를 참조하고 있다고 생성자로부터 가정합니다. –

+0

예, 더 분명 해졌다. System.Threading 네임 스페이스를 포함하도록 편집되었습니다. 또한 내 솔루션은 ProcessPerson이 20 초마다 호출되는 것을 보장하지 않으며 마지막 ProcessPerson이 완료되었는지 여부에 관계없이 20 초마다 ProcessPerson을 호출합니다. – Adam

관련 문제