2008-10-10 4 views
5

나는 기능을 추가 할 VB.Net 2.0에서 기존 WinForms Mdi 응용 프로그램이 있습니다. 추가 사항 중 하나는 현재 시간이 지정된 값 (기한)에 근접 할 때 발생해야하는 경고입니다. 제 의도는 마감 시간까지 1 시간 미만이 될 때까지 한 시간에 한 번씩 시간을 확인한 다음 시간이 끝날 때까지 지정된 간격으로 경고를 표시하는 것입니다.어느 .Net 타이머()

사용자는 최종 기한까지 응용 프로그램을 계속 사용할 수 있어야하지만 주기적으로 기한 근접을 인식해야합니다.

앱은 아직 System.Threading을 사용하지 않고 있으며, 내 지식은 현재로서는 제한적입니다.

  • 이 System.Threading.Timer(),
  • Windows.Forms.Timer()와
  • System.Timers.Timer()
  • : 나는 3 개의 다른 타이머() 메소드가 있다는 것을 알고있다

제 질문은 이것이 가장 좋은 방법입니다. 스레드 타이머를 사용하려고했지만 WinForms 스레드 안전하지 않기 때문에 다른 클래스에 액세스하려고하면 런타임 오류가 발생했습니다. 클래스/폼 스레드를 안전하게 만드는 것이 가치가 있습니까? 나는 완전히 벗어 났는가?

감사합니다.

+0

그것은 BTW, 스레드 윈폼에게 프로그래밍을 할 수도 있습니다. 메서드 호출이 폼과 같은 스레드에서 만들어지고 있는지 알아 내고, 그렇지 않은 경우에는 적절한 스레드로 디스패치하면됩니다. 그것은 실제보다 더 열심히 들립니다. –

답변

6

폼 타이머 만 사용합니다. 나는 그것이 정확하지는 않다는 것을 읽은 것 같지만 당신이 필요로하지 않는 것처럼 들린다.

+2

양식 타이머가 양식에서 자동으로 동기화되므로 스레드 간 제어 액세스 문제를 보너스 –

11

이 문서 꽤 잘 설명 : System.Windows.Forms.Timer는 당신을위한 하나입니다처럼 소리

Comparing the Timer Classes in the .NET Framework Class Library

.

내 지침 : 타이머를 기본 GUI 스레드에서 실행하려면 Windows.Forms.Timer를 사용하십시오. 스레드 풀 스레드에서 타이머를 비동기 적으로 호출하는 것이 좋거나 System.Windows.Forms.Timer가받는 경향이 적은 작은 지연을 경험하지 않으려면 System.Timers.Timer를 사용하십시오. System.Threading.Timer는 다른 두 인터페이스와 다른 인터페이스를 가지며 스레드로부터 안전하지 않습니다. 개인적으로, 나는 팬이 아니다.

-1

좋아, 첫 번째 것들 먼저 ... 당신이 사용자 양식을 보여주고 싶은 백그라운드에서 뭔가를 할 경우 나는 BackgroundWorker 클래스를 사용하는 것이

, 그것은 전에 나를 위해 일했다. 또한 앞에서 언급 한 것처럼 호출 메소드가 필요하며 Chris가 말했듯이 실제보다 더 열심히 소리가납니다.

다음은 내가 당신을 도울 것이라고 생각하는 링크입니다.
http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx

+1

-1로 제거해야합니까? 내 대답에 무슨 문제가 있니? – sebagomez

0

System.Forms.Timer는 실제로 Windows 메시지 큐를 사용하여 주 스레드에서 작동합니다. 이것은 다소 힘이 들지만, ms 정밀도를 필요로하지 않기 때문에 충분합니다. 별도의 스레드에서 작동하는 다른 타이머 중 하나를 사용할 수 있지만 주에서 작동하는 winforms 구성 요소를 활성화해야하므로 Form.Invoke 또는 다른 방법으로 이벤트를 주 스레드로 전달해야합니다 - 어떤 잠복기도 발생할 수 있습니다. 결론적으로 Winforms 기반 구성 요소를 활성화해야 할 경우 System.Forms.Timer를 사용하십시오.