2013-03-27 4 views
0

나는 부모와는 별도로 스레드에서 시간을 초과 한 작업을 수행 할 수있는 클래스를 원하지만, 어떤 스레드가 여러 스레드에 속하는지 조금 혼란 스럽다. 어떤 정보라도 감사 할 것이다.메소드는 어느 스레드에서 실행됩니까?

나의 목적은 부모 래핑 객체에 의해 제어되는 둘 이상이 있기 때문에 시간 초과 작업을 부모와 독립적으로 작동하게하는 것입니다.

내가 생각 해낸 것입니다 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 

public class timed_load_process { 
    private object _lock; 
    protected string process; 
    protected Timer timer; 
    protected bool _abort; 
    protected Thread t; 

    protected bool aborting { get { lock (_lock) { return this._abort; } } } 

    public timed_load_process(string process) { 
     this._abort = false; 
     this.process = process; 
     this.t = new Thread(new ThreadStart(this.threaded)); 
     this.t.Start(); 
    } 

    protected void threaded() { 
     this.timer = new Timer(new TimerCallback(this.tick), false, 0, 1000); 
     while (!this.aborting) { 
      // do other stuff 
      Thread.Sleep(100); 
     } 
     this.timer.Dispose(); 
    } 

    protected void tick(object o) { 
     // do stuff 
    } 

    public void abort() { lock (_lock) { this._abort = true; } } 
} 

타이머가 스레드 내부에서 인스턴스화 때문에, 스레드 t 내부 운영, 또는 timed_load_process의 실 내부, 나는 동작한다고 가정 않습니다 tick은 타이머 t과 같은 스레드에서 작동합니다.

와 함께 종료 : 당신이 System.Threading.Timer을 사용하고 같은

public class timed_load_process : IDisposable { 
    private object _lock; 
    private bool _tick; 
    protected string process; 
    protected Timer timer; 
    protected bool _abort; 

    public bool abort { 
     get { lock (_lock) { return this._abort; } } 
     set { lock (_lock) { this.abort = value; } } 
    } 

    public timed_load_process(string process) { 
     this._abort = false; 
     this.process = process; 
     this.timer = new Timer(new TimerCallback(this.tick), false, 0, 1000); 
    } 

    public void Dispose() { 
     while (this._tick) { Thread.Sleep(100); } 
     this.timer.Dispose(); 
    } 

    protected void tick(object o) { 
     if (!this._tick) { 
      this._tick = true; 
      // do stuff 
      this._tick = false; 
     } 
    } 
} 
+0

포럼 사이트와 달리 "감사"또는 "도움을 주신 분께"또는 [서명]을 사용하지 않습니다. "[안녕하세요, '고마워,'태그 라인 및 인사말을 게시물에서 삭제해야합니까?] (http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be 참조) -removed-from-posts) –

+0

어떤 종류의 타이머입니까 - 네임 스페이스가없는 것입니까? –

+0

텍스트 위에 usings를 삽입했는데이 타이머를 System.Threading 타이머로 설정했습니다 .. – marts

답변

3

것 같습니다. 그렇다면 tick 메서드는 풀 스레드에서 실행됩니다. 가장 확실하게 이 아니며 응용 프로그램의 주 스레드 인이 아닙니다.

Windows Forms 타이머는 GUI 스레드에서 경과 이벤트를 실행합니다.

System.Timers.Timer의 기본 동작은 풀 스레드에서 Elapsed 이벤트를 실행하는 것입니다. 그러나 Windows Forms 구성 요소를 참조하도록 SynchronizingObject을 설정하면 이벤트가 GUI 스레드로 마샬링됩니다. http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx

가입일

+0

그래서 스레드를 제거 할 수 있음을 의미 할 것입니다. 프로세스의 일부분 만 완전히 틱이 액세스 할 수없는 필드에 액세스하지 않는 한). 타이머가 특별히 쓰레드를 설정하지 않고 틱 작동을 실행하게합니다. 그것은 코드를 많이 단순화합니다 :) – marts

+1

또한 새 스레드에서 타이머를 만들 필요가 없습니다. 또한 중단 될 때까지 차단하려면 ManualResetEvent를 사용하는 것이 좋습니다. 마지막으로 IDisposable 인터페이스를 구현하고 해당 Dispose 메서드에서 timer.Dispose를 호출하는 것이 좋습니다. –

+0

이러한 의견을 바탕으로 나는 이것이 최후의 놀이라고 생각합니다 : ... 주요 질문에 추가하십시오, 너무 오래되었습니다! – marts

0

"타이머를 생성 스레드 실행하지 않는 단계;.이 시스템에 의해 제공되는 스레드 풀 스레드 실행"

관련 문제