요즘 가능한 타이머 중 일부를 확인하고 System.Threading.Timer
있으며System.Timers.Timer
(그들이 스레드 풀링을 지원하기 때문에) 나에게 필요한 보는 사람입니다.
나는 게임을 만들고 있으며 다른 간격으로 모든 유형의 이벤트를 사용할 계획입니다.
어느 것이 가장 좋을까요?
요즘 가능한 타이머 중 일부를 확인하고 System.Threading.Timer
있으며System.Timers.Timer
(그들이 스레드 풀링을 지원하기 때문에) 나에게 필요한 보는 사람입니다.
나는 게임을 만들고 있으며 다른 간격으로 모든 유형의 이벤트를 사용할 계획입니다.
어느 것이 가장 좋을까요?
답변:
이 기사는 상당히 포괄적 인 설명을 제공합니다.
" .NET Framework 클래스 라이브러리에서 타이머 클래스 비교 "-사용 가능 -.chm 파일로
구체적인 차이점 System.Timers.Timer
은 멀티 스레드 응용 프로그램에 맞춰져 있기 때문에 SynchronizationObject
속성을 통해 스레드로부터 안전 하지만 스레드에서 기본적 으로 안전 System.Threading.Timer
하지는 않다는 것입니다.
나는 당신의 간격이 얼마나 작은 지에 관한 두 가지의 차이점이 있다고 생각하지 않습니다.
System.Threading.Timer
"아이론 식으로"스레드 안전하지 않으며 System.Threading.Thread
풀을 통해 얻은 스레드와 동일합니다. 이러한 클래스가 손을 잡고 lock
키워드 자체 의 사용을 관리 한다고해서 이러한 클래스가 스레드로부터 안전하지 않다는 의미는 아닙니다. System.Threading.Thread
정확히 사실이기 때문에 스레드 안전하지 않다고 말할 수도 있습니다 .
SynchronizingObject
타이머 개체 자체가 스레드 안전하지 않습니다. 그냥 있는지 확인합니다 코드 (당신이 적절하게 그 속성을 설정하는 경우) 타이머 이벤트를 처리하는이 특정 스레드에서 호출된다. 타이머 객체 자체는 문서에서 명확하게 언급 된 것처럼 스레드 안전을 보장 하지 않습니다 . 반면에 System.Threading.Timer
객체 는 스레드로부터 안전한 것으로 문서화되어 있습니다.
System.Threading.Timer
일반 타이머입니다. 작업자 풀에서 스레드 풀 스레드로 다시 전화를 겁니다.
System.Timers.Timer
A는 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 또는 아마도 모든 사람들은 다음을 의미합니다.
타이머를 사용할 때 경쟁 조건을 쉽게 작성할 수 있습니다. 예를 들어 다음 질문을보십시오 : Timer (System.Threading) thread safety
당신의 타이머 이벤트가 트리거하고 다시 당신을 호출 할 수 있습니다 타이머 통지의 재진입 두 번째 당신이 처리를 완료하기 전에 시간 첫번째 이벤트. 예 를 들어이 질문을 참조하십시오 : System.Threading.Timer 및 Monitor를 사용하여 스레드 안전 실행
Jeff Ritcher 는 자신의 저서 " CLR Via C # " 에서을 사용하지 말 것을 권장합니다 System.Timers.Timer
.이 타이머는에서 파생되어 System.ComponentModel.Component
Visual Studio의 디자인 화면에서 사용할 수 있습니다. 따라서 디자인 화면에서 타이머를 원하는 경우에만 유용합니다.
그는 System.Threading.Timer
스레드 풀 스레드에서 백그라운드 작업에 사용하는 것을 선호합니다 .
System.Threading.Timer
스레드 풀을 사용하거나 자신의 쓰레드를 생성 가깝다. 중 물론 이러한 클래스는 당신을위한 동기화를 처리하지 않는 -의 당신의 일이! 스레드 풀 스레드, 자체 스레드 또는 타이머 콜백은 잠금을 처리하지 않습니다. 어떤 객체와 어떤 방식으로 잠금해야 할 상황에서 적절한 판단이 필요하며 타이머의 스레딩 버전은 가장 유연하고 세분성.
이에 대한 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에 대한 이전 정보가 더 이상 유효하지 않으므로 답변을 변경해야합니다.
위에서 언급하지 않은 중요한 차이점 중 하나는 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);
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 구성 요소입니다.
SynchronizingObject 를 설정 System.Timers.Timer
하여 ISynchronizeInvoke 를 통해 모든 타이머 만료 콜백을 호출하는 옵션이 있다는 점을 제외하고 두 클래스는 기능적으로 동일 합니다 . 그렇지 않으면 두 타이머가 스레드 풀 스레드에서 만기 콜백을 호출합니다.
를 System.Timers.Timer
Windows Forms 디자인 화면으로 드래그하면 Visual Studio는 SynchronizingObject 를 폼 개체로 설정 하여 UI 스레드에서 모든 만료 콜백을 호출합니다.