System.Timers.Timer 대 System.Threading.Timer


565

요즘 가능한 타이머 중 일부를 확인하고 System.Threading.Timer있으며System.Timers.Timer (그들이 스레드 풀링을 지원하기 때문에) 나에게 필요한 보는 사람입니다.

나는 게임을 만들고 있으며 다른 간격으로 모든 유형의 이벤트를 사용할 계획입니다.

어느 것이 가장 좋을까요?

답변:


363

이 기사는 상당히 포괄적 인 설명을 제공합니다.

" .NET Framework 클래스 라이브러리에서 타이머 클래스 비교 "-사용 가능 -.chm 파일로

구체적인 차이점 System.Timers.Timer은 멀티 스레드 응용 프로그램에 맞춰져 있기 때문에 SynchronizationObject속성을 통해 스레드로부터 안전 하지만 스레드에서 기본적 으로 안전 System.Threading.Timer하지는 않다는 것입니다.

나는 당신의 간격이 얼마나 작은 지에 관한 두 가지의 차이점이 있다고 생각하지 않습니다.


69
"이 발췌 부분은 깨달았습니다."System.Windows.Forms.Timer와 달리 System.Timers.Timer 클래스는 기본적으로 CLR (공용 언어 런타임) 스레드 풀에서 얻은 작업자 스레드에서 타이머 이벤트 처리기를 호출합니다. [...] System.Timers.Timer 클래스는 이러한 딜레마를 처리하는 쉬운 방법을 제공합니다. 공용 SynchronizingObject 속성을 노출합니다이 속성을 Windows Form 인스턴스 (또는 Windows Form의 컨트롤)에 설정하면 Elapsed 이벤트 핸들러의 코드가 SynchronizingObject가 인스턴스화 된 동일한 스레드에서 실행되는지 확인하십시오. "
mico

7
에서 스레드 안전 섹션에 따르면 Threading.Timer'의 MSDN 문서 , 그것은 ... 스레드 안전 완벽하다
피터

62
System.Threading.Timer"아이론 식으로"스레드 안전하지 않으며 System.Threading.Thread풀을 통해 얻은 스레드와 동일합니다. 이러한 클래스가 손을 잡고 lock키워드 자체 의 사용을 관리 한다고해서 이러한 클래스가 스레드로부터 안전하지 않다는 의미는 아닙니다. System.Threading.Thread정확히 사실이기 때문에 스레드 안전하지 않다고 말할 수도 있습니다 .
Kirk Woll

8
또한 System.Timer.Timer 간격은 Int32 만 가능합니다. System.Threading.Timer 간격은 최대 Int64
Brent

11
불행히도이 오해의 소지가있는 (최상의) 답변이 받아 들여지고 투표율이 높아지는 것은 유감입니다. 대답 자체의 유일한 물질 진술은 단순히 잘못되었습니다. 는 SynchronizingObject타이머 개체 자체가 스레드 안전하지 않습니다. 그냥 있는지 확인합니다 코드 (당신이 적절하게 그 속성을 설정하는 경우) 타이머 이벤트를 처리하는이 특정 스레드에서 호출된다. 타이머 객체 자체는 문서에서 명확하게 언급 된 것처럼 스레드 안전을 보장 하지 않습니다 . 반면에 System.Threading.Timer객체 스레드로부터 안전한 것으로 문서화되어 있습니다.
피터 Duniho

169

System.Threading.Timer일반 타이머입니다. 작업자 풀에서 스레드 풀 스레드로 다시 전화를 겁니다.

System.Timers.TimerA는 System.ComponentModel.Component그 래핑System.Threading.Timer 특정 스레드에 파견을 위해 사용되는 몇 가지 추가 기능을하고 있습니다.

System.Windows.Forms.Timer대신 기본 메시지 전용 HWND 를 래핑하고 창 타이머를 사용 합니다. 를 하여 해당 HWND 메시지 루프에서 이벤트를 발생시킵니다.

앱에 UI가없고 가능한 가장 가볍고 범용적인 .Net 타이머를 원한다면 (자신의 스레딩 / 디스 패싱을 알아내는 것이 기쁘기 때문에) System.Threading.Timer 프레임 워크에서 얻는 것만 큼 좋습니다.

'안전하지 않은 스레드'문제가 무엇인지 명확하지 않습니다 System.Threading.Timer. 아마도이 질문에서 묻는 것과 동일 할 것입니다 : System.Timers.Timer 대 System.Threading.Timer의 Thread-safety 또는 아마도 모든 사람들은 다음을 의미합니다.

  1. 타이머를 사용할 때 경쟁 조건을 쉽게 작성할 수 있습니다. 예를 들어 다음 질문을보십시오 : Timer (System.Threading) thread safety

  2. 당신의 타이머 이벤트가 트리거하고 다시 당신을 호출 할 수 있습니다 타이머 통지의 재진입 두 번째 당신이 처리를 완료하기 전에 시간 첫번째 이벤트. 예 를 들어이 질문을 참조하십시오 : System.Threading.Timer 및 Monitor를 사용하여 스레드 안전 실행


참은 System.Timers.Timer사용 System.Threading.Timer내부적으로합니다. 소스 코드를 참조하십시오 .
Stomy

120

Jeff Ritcher 는 자신의 저서 " CLR Via C # " 에서을 사용하지 말 것을 권장합니다 System.Timers.Timer.이 타이머는에서 파생되어 System.ComponentModel.ComponentVisual Studio의 디자인 화면에서 사용할 수 있습니다. 따라서 디자인 화면에서 타이머를 원하는 경우에만 유용합니다.

그는 System.Threading.Timer스레드 풀 스레드에서 백그라운드 작업에 사용하는 것을 선호합니다 .


36
디자인 화면에서 사용할 수 있습니다. 반드시 그럴 필요는 없으며 그렇게하지 않아도 해로운 영향이 없습니다. 이 질문에 대한 이전 답변의 기사를 읽으면 Timers.Timer가 Threading.Timer보다 훨씬 선호됩니다.
Stephen Drew

6
글쎄, 바람직한 것은 상황에 따라 다릅니다. 내가 이해하는 것처럼 System.Threading.Timer는 ThreadPool의 새 작업자 스레드에서 전달 된 콜백을 실행합니다. 어느 것이 반드시 스레드 안전하지 않은 이유라고 생각합니다. 킨다는 의미가 있습니다. 따라서 이론 상으로는이 타이머가 자동으로 작업자 스레드를 회전시키는 번거 로움에 대해 걱정할 필요가 없습니다. 킨다는 엄청나게 유용한 것 같습니다.
Finster

6
사용하여 System.Threading.Timer스레드 풀을 사용하거나 자신의 쓰레드를 생성 가깝다. 물론 이러한 클래스는 당신을위한 동기화를 처리하지 않는 -의 당신의 일이! 스레드 풀 스레드, 자체 스레드 또는 타이머 콜백은 잠금을 처리하지 않습니다. 어떤 객체와 어떤 방식으로 잠금해야 할 상황에서 적절한 판단이 필요하며 타이머의 스레딩 버전은 가장 유연하고 세분성.
Kirk Woll

2
-1이 답변이 주관 또는 시작과 제안이 System.Threading.Timer는 제프 Ritcher 선호하는 이유에 대한 구체적인 정보로부터 의견을 고집하다
브라이언 오그 덴

42

이에 대한 Microsoft의 정보 ( MSDN에 대한 설명 참조 ) :

  • 시스템 타이머 이벤트를 발생시키고 규칙적인 간격으로 하나 이상의 이벤트 싱크에서 코드를 실행합니다. 이 클래스는 다중 스레드 환경에서 서버 기반 또는 서비스 구성 요소로 사용하기위한 것입니다. 사용자 인터페이스가 없으며 런타임에 표시되지 않습니다.
  • 시스템 스레딩 타이머 . 일정한 간격으로 스레드 풀 스레드에서 단일 콜백 메소드를 실행합니다. 콜백 메소드는 타이머가 인스턴스화되어 변경할 수 없을 때 정의됩니다. System.Timers.Timer 클래스와 마찬가지로이 클래스는 다중 스레드 환경에서 서버 기반 또는 서비스 구성 요소로 사용하기위한 것입니다. 사용자 인터페이스가 없으며 런타임에 표시되지 않습니다.
  • System.Windows.Forms.Timer 이벤트를 발생시키고 일정한 간격으로 하나 이상의 이벤트 싱크에서 코드를 실행하는 Windows Forms 구성 요소 인 (.NET Framework 만 해당). 이 구성 요소에는 사용자 인터페이스가 없으며 단일 스레드 환경에서 사용하도록 설계되었습니다. UI 스레드에서 실행됩니다.
  • 정기적 인 간격으로 비동기 또는 동기 웹 페이지 포스트 백을 수행하는 ASP.NET 구성 요소 인 System.Web.UI.Timer (.NET Framework 만 해당)

System.Timers.Timer.NET Core 1.0에서 더 이상 사용되지 않지만 .NET Core 2.0 (/ .NET Standard 2.0)에서 다시 구현 되었다는 것은 흥미로운 사실 입니다. .NET Standard 2.0의 목표는 가능한 한 .NET Framework에서 전환하는 것이 쉬워야한다는 것이 었습니다.

더 이상 사용되지 않을 때는 .NET 이식성 분석기 Visual Studio 추가 기능System.Threading.Timer대신 사용 하는 것이 좋습니다 .

Microsoft가 System.Threading.Timer이전에 선호하는 것처럼 보입니다 System.Timers.Timer.

편집 노트 2018-11-15 : .NET Core 1.0에 대한 이전 정보가 더 이상 유효하지 않으므로 답변을 변경해야합니다.



@Taegost의 사용도 제한적입니다. MSDN msdn.microsoft.com/en-us/library/…를 참조 하고 플랫폼 가용성에 대한 설명을 읽으십시오.
astrowalker

@astrowalker-고마워, 의견을 말할 때이 답변에는 거의 세부 사항이 없었습니다. 지금은 내가 문의 한 세부 사항이 있으므로 의견을 삭제했습니다.
Taegost

1
System.Timers.Timer는 이제 .NET Standard 2.0 및 .NET Core 2.0 이상에서 지원됩니다. docs.microsoft.com/ko-kr/dotnet/api/system.timers.timer (문서 끝까지 스크롤)
Lee Grissom


39

위에서 언급하지 않은 중요한 차이점 중 하나는 System.Timers.Timer예외 를 자동으로 삼키지 만 System.Threading.Timer그렇지 않은 것은 아닙니다.

예를 들면 다음과 같습니다.

var timer = new System.Timers.Timer { AutoReset = false };
timer.Elapsed += (sender, args) =>
{
    var z = 0;
    var i = 1 / z;
};
timer.Start();

vs

var timer = new System.Threading.Timer(x =>
{
    var z = 0;
    var i = 1 / z;
}, null, 0, Timeout.Infinite);

1
최근에 Timers.Timer 로이 문제를 겪었고 매우 고통 스럽습니다 ... Threading.Timer로 어떻게 다시 쓸 수 있습니까? stackoverflow.com/questions/41618324/…
Tez Wingfield 2012 년

7
소스 코드에 빈 캐치가 있습니다. 여기
stomy

왜 MS 프로그래머가 똑같은 일을 할 수 없습니까?
xmedeko

2
하나는 예외를 삼키고 다른 하나는 예외를 삼키는 방법을 설명하지 않습니다. 누군가 세부 사항을 기입 해 주시겠습니까?
sean

24

MSDN 에서 짧은 비교를 찾았습니다.

.NET Framework 클래스 라이브러리에는 Timer라는 네 개의 클래스가 포함되어 있으며 각 클래스는 서로 다른 기능을 제공합니다.

System.Timers.Timer이벤트를 발생시키고 규칙적인 간격으로 하나 이상의 이벤트 싱크에서 코드를 실행합니다. 이 클래스는 다중 스레드 환경에서 서버 기반 또는 서비스 구성 요소로 사용하기위한 것입니다. 사용자 인터페이스가 없으며 런타임에 표시되지 않습니다.

System.Threading.Timer스레드 풀 스레드에서 단일 간격의 단일 콜백 메소드를 실행합니다. 콜백 메소드는 타이머가 인스턴스화되어 변경할 수 없을 때 정의됩니다. System.Timers.Timer 클래스와 마찬가지로이 클래스는 다중 스레드 환경에서 서버 기반 또는 서비스 구성 요소로 사용하기위한 것입니다. 사용자 인터페이스가 없으며 런타임에 표시되지 않습니다.

System.Windows.Forms.Timer이벤트를 발생시키고 일정한 간격으로 하나 이상의 이벤트 싱크에서 코드를 실행하는 Windows Forms 구성 요소입니다. 이 구성 요소에는 사용자 인터페이스가 없으며 단일 스레드 환경에서 사용하도록 설계되었습니다.

System.Web.UI.Timer정기적 인 간격으로 비동기식 또는 동기식 웹 페이지 포스트 백을 수행하는 ASP.NET 구성 요소입니다.


1

SynchronizingObject 를 설정 System.Timers.Timer하여 ISynchronizeInvoke 를 통해 모든 타이머 만료 콜백을 호출하는 옵션이 있다는 점을 제외하고 두 클래스는 기능적으로 동일 합니다 . 그렇지 않으면 두 타이머가 스레드 풀 스레드에서 만기 콜백을 호출합니다.

System.Timers.TimerWindows Forms 디자인 화면으로 드래그하면 Visual Studio는 SynchronizingObject 를 폼 개체로 설정 하여 UI 스레드에서 모든 만료 콜백을 호출합니다.


1

MSDN에서 : System.Threading.Timer콜백 메소드를 사용하고 스레드 풀 스레드에서 제공하는 단순하고 가벼운 타이머입니다. 콜백은 사용자 인터페이스 스레드에서 발생하지 않으므로 Windows Forms에서는 사용하지 않는 것이 좋습니다. System.Windows.Forms.TimerWindows Forms와 함께 사용하는 것이 더 좋습니다. 서버 기반 타이머 기능의 경우 System.Timers.Timer이벤트 사용 및 추가 기능이있는를 사용 하는 것이 좋습니다.

출처

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.