2009-04-08 2 views
13

나는 내 응용 프로그램의 메시징 측면은 Jabber-net (AN XMPP library를.)를 사용하여이 나는 서버에 대한 연결이 종료 어떤 이유로, 분 정도 간격을 연결하려고 계속 경우 수행하고자하는 어떤.NET 타이머가 비동기로 실행 되나요?

.

다음에 시도하기 전에 일정 기간 대기하도록 타이머를 시작하면 해당 타이머가 비동기 적으로 실행되고 결과 Tick 이벤트가 주 스레드에 참여하거나 내 스레드를 시작하고 타이머를 시작해야합니다 거기에?

답변

35

어떤 종류의 타이머를 사용하고 있습니까? 당신이 SynchronizingObject

  • System.Threading.Timer를 지정하지 않는

    • System.Windows.Forms.Timer는 스레드 풀 스레드 모두에서

    에 콜백을 실행

  • System.Timers.Timer는 스레드 풀 스레드에서 실행하는 UI 스레드에서 실행됩니다 타이머 자체는 비동기식이 될 것이고, 발동 될 때까지 스레드를 "사용하지"않을 것이다.

  • +0

    System.Windows.Forms.Timer를 사용하지 않는 경우 컨트롤에 액세스하면 적절한 InvokeRequired 검사 및 호출을 수행하지 않으면 Exception을 throw합니다. –

    +0

    맞아, 내 질문에 내가 사용해야 할 타이머가 확실하지 않다고 말했어 야했다. MSDN을 제공하고 읽은 세 가지 옵션을 살펴보면 System.Timers.Timer는 Tick의 경우처럼 오른쪽의 경우처럼 보입니다.이 호출은 주 스레드에서 만들어진 개체에 만들어야합니다. – MrEdmundo

    +0

    @MrEdmundo : "주 스레드"가 정확히 무엇을 의미합니까? –

    1

    타이머가 백그라운드에서 효과적으로 실행되어 주 스레드의 이벤트가 실행됩니다.

    +0

    감사합니다. 나는 그럴 줄 알았는데 누군가와 소리를 낼 필요가 있다고 생각했습니다. – MrEdmundo

    1

    .NET에서 타이머를 구현하는 방법을 잘 모르겠지만 타이머를 만들기 위해 Windows API를 사용하는 경우 양식 메시지 루프는 WM_TIMER 메시지를 수신하며 양식 스레드가 사용 중이 아닌 경우에만 처리 ​​할 수 ​​있습니다. 요청에 따라 적절한 시간에 타이머가 작동하지만 UI 스레드가 스톨 될 수 있습니다. 타이머는 SetTimer API로 시작되며 OS는 WM_TIMER 메시지를 게시합니다.

    제가 확인했습니다

    System.Windows.Forms.Timer+TimerNativeWindow.StartTimer(Int32)에 따라 다릅니다 :

    [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)] 
    public static extern IntPtr SetTimer(HandleRef hWnd, int nIDEvent, int uElapse, IntPtr lpTimerFunc); 
    

    그래서에만이 타이머는 설명 "문제"를 가지고있다.