2014-07-23 3 views
1

클라이언트가 다양한 대상에 대한 정보를 기록하기 위해 호출하는 정적 메서드가있는 DLL이 있습니다. 이 메소드는 ThreadPool을 사용하여 다른 스레드에서 로깅 작업을 시작합니다. 프로세스가 종료되기 전에 이러한 스레드가 안정적으로 완료되도록하는 방법이 필요합니다. AppDomains의 ProcessExit 이벤트는 3.5 CF에서 사용할 수 없으므로 어디서/어떻게이 스레드가 끝날 때까지 안정적으로 기다릴 수 있습니까? 내가 생각할 수있는 유일한 해결책은 스레드 전경 스레드 (스레드에 대한 작업이 작고 유한)를 만드는 것입니다,하지만 이것은 다른 형태이므로 나쁜 형태라고 대답했습니다 (하지만 자격이 없으므로 이유는 확실하지 않습니다).백그라운드 스레드가 프로세스 종료시 .NET Compact Framework 3.5 DLL에 완료되도록하십시오.

+0

WaitHandle.WaitAll()이 사용 가능한 것으로 보이지 않습니다. Thread.CurrentThread.IsBackground = false;를 사용하여 바꿀 수 있습니다. 귀하의 스레드 방법. 그것이 "나쁜 형식"이라면 WaitOne() 또는 Join()을 사용할 수 있도록 스레드 트랙을 잃지 않도록해야합니다. 그것은 또 다른 종류의 "나쁜 형태", 비현실적인 종류입니다. –

+0

답장을 보내 주셔서 감사합니다. Hans, 3.5 CF의 동기화 프리미티브에 대한 지원은 매우 제한되어 있습니다. 전경 스레드를 사용하는 경우 스레드가 완료 될 때까지 응용 프로그램을 계속 유지하므로 스레드에 참여하지 않아도됩니다. – BrizzleOwl

+0

배경 스레드가 실제로 필요합니까? 그들이하는 일이 '작고 유한하다'면 작업 대기열에서 로깅 작업을 실행하는 하나의 지속적인 스레드가 있어야합니다. 귀하의 답변에 대해 – tcarvin

답변

0

마찬가지로 상태 객체를 사용하여 스레드 풀에서 시작된 모든 스레드에 대한 참조를 가져야합니다. 이벤트 처리기를 사용하여 스레드가 종료 된 주 프로세스를 알립니다. 256 스레드에 도달 할 때까지 여기

using System; 
using System.Threading; 

namespace ThreadPoolTest 
{ 
    class MainClass 
    { 
     static int intRest=256; 
     static object lockObject=new object(); 
     public static void Main (string[] args) 
     { 
      bool bStop=false; 
      Console.WriteLine ("Hello World!"); 
      work w=new work(); 
      //start about 256 threads using ThreadPool 
      w.start(); 
      w.CounterReached+=count; 
      do{ 
       Thread.Sleep(1000); 
       lock(lockObject){ 
        if(intRest==0) 
         bStop=true; 
       } 
      }while(!bStop); 
      Console.WriteLine ("### Hello World END ###"); 
     } 

     static void count(object sender, work.CounterEventArgs e){ 
      lock(lockObject){ 
       intRest--; //count down instead of checking which thread has terminated 
      } 
      Console.WriteLine("got event for " + e.counter.ToString()); 
     } 
    } 
    class work{ 

     public class CounterEventArgs : EventArgs 
     { 
      public int counter { get; set; } 
      public CounterEventArgs(int i){ 
       counter=i; 
      } 
     } 
     protected virtual void OnThresholdReached(CounterEventArgs e) 
     { 
      EventHandler<CounterEventArgs> handler = CounterReached; 
      if (handler != null) 
      { 
       handler(this, e); 
      } 
     } 

     public event EventHandler<CounterEventArgs> CounterReached; 

     void threadStart(object o){ 
      int i = (int)o; 
      System.Console.WriteLine("Thread: "+i.ToString()+" started"); 
      System.Threading.Thread.Sleep(1000); 
      System.Console.WriteLine("Thread: "+i.ToString()+" ended"); 
      OnThresholdReached(new CounterEventArgs(i)); 
     } 


     public void start(){ 
      for(int i=0; i<256; i++){ 
       WaitCallback w=new WaitCallback(threadStart); 
       System.Threading.ThreadPool.QueueUserWorkItem(w, i); 
      } 
     } 
    } 
} 

내가 새 스레드를 시작합니다 : 여기

콘솔 코드를 사용하여 간단한 예이다. 각 Waitcallback은 시작된 스레드의 번호를 가져옵니다. 주 프로세스/스레드는 모든 스레드가 완료 될 때까지 while 루프 (콘솔 응용 프로그램) 내부를 기다립니다.