System.Timers.Timer 대 System.Threading.Timer 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.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를 사용하여 스레드 안전 실행


답변

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

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