2012-01-16 10 views
-6

ここでは、ジョブA以外の長いプロセスでジョブAが実行されていると仮定した場合の、C#.netのシングルスレッド化の使用方法を説明します。完成したいずれかのいくつかの提案は、できるだけ早くc#.netでこの単一のスレッドをマルチスレッド化する方法

protected override void OnStart(string[] args) 
{ 
    strNowDate = DateTime.Now.ToLongTimeString(); 
    timerjob.Elapsed += new ElapsedEventHandler(CsvGenFromDatabase); 
    timerjob.Interval = Convert.ToDouble(DueTime); 
    timerjob.Enabled = true; 
    eventLog1.WriteEntry("my service started"); 
} 
protected override void OnStop() 
{ 
    strNowDate = DateTime.Now.ToLongTimeString(); 
    eventLog1.WriteEntry("my service stopped"); 
} 
private void CsvGenFromDatabase(object sender, EventArgs e) 
{ 
    timerjob.stop(); 
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew)) // Transaction Scope Started 
    { 
     Thread threadITD = new Thread(new ThreadStart(FileGenerationForITD)); // Thread Initialize for ITD 
     Thread threadCTD = new Thread(new ThreadStart(FileGenerationForCTD)); // Thread Initialize for CTD 
     Thread threadCID = new Thread(new ThreadStart(FileGenerationForCID)); // Thread Initialize for CID 
     Thread threadFFM = new Thread(new ThreadStart(FileGenerationForFFM)); // Thread Initialize for FFM 
     try  
     {     
      if ((threadITD == null) || 
       (threadITD.ThreadState == System.Threading.ThreadState.Stopped) || 
       (threadITD.ThreadState == System.Threading.ThreadState.Unstarted)) 
      { 
       threadITD.Start(); // Thread Started for ITD 
      }     
      if ((threadCTD == null) || 
       (threadCTD.ThreadState == System.Threading.ThreadState.Stopped) || 
       (threadCTD.ThreadState == System.Threading.ThreadState.Unstarted)) 
      { 
       threadCTD.Start(); // Thread Started for CTD 
      } 
      if ((threadCID == null) || 
       (threadCID.ThreadState == System.Threading.ThreadState.Stopped) || 
       (threadCID.ThreadState == System.Threading.ThreadState.Unstarted)) 
      { 
       threadCID.Start(); // Thread Started for CID 
      }     
      if ((threadFFM == null) || 
       (threadFFM.ThreadState == System.Threading.ThreadState.Stopped) || 
       (threadFFM.ThreadState == System.Threading.ThreadState.Unstarted)) 
      { 
       threadFFM.Start(); // Thread Started for FFM 
      } 
     } 
     catch (Exception ex) 
     { 
      objErrorLog.SrtErrorText = ex.ToString().Substring(0, 25); 
      objErrorLog.StrErrorDescription = ex.ToString(); 
      objErrorLog.WriteErrorLog(objErrorLog); 
     } 
     finally 
     { 
      scope.Complete(); 
     } 
    } 
    timerjob.start(); 
} 
+0

@MitchWheat - M.Babcock @ –

+0

が親切マルチスレッディングにとして変更のためにそれを私を助けて...ということができるすべては、私はこのウィンドウサービス – pravz

+2

@pravzに新しいですされる - これが唯一のですがあなたが投稿したコードの多くの明らかな問題の1つ、[BackgroundWorker](http://www.dreamincode.net/forums/topic/112547-using-the-backgroundworker-in-c%23/)にあなたを紹介しましょう。 )。 –

答えて

2

これを喜ば与えることができ、それはジョブBのために行くことはありませんが、ここでの要件は、すべてのジョブがアクティブになる必要がありますが、仕事のどれもが、私はこのスレッドを変更することができますどのようにintruptedはありません飽きていますすでにマルチスレッド化されているようです。各FileGenerationForXXXメソッドの開始と終了にロギングコードを追加して、4つのメソッドが一緒に開始し、別々に停止することを確認してください。

private void FileGenerationForITD() 
{ 
    eventlog1.WriteEntry("FileGenerationForITD started."); 
    ... 
    eventlog1.WriteEntry("FileGenerationForITD finished."); 
} 

さらに、ifステートメントのすべてをノックアウトすることができます。 newStart()の間で何も変更されていないため、スレッドオブジェクトはその状態にあることが保証されています。

Thread threadITD = new Thread(new ThreadStart(FileGenerationForITD)); 
Thread threadCTD = new Thread(new ThreadStart(FileGenerationForCTD)); 
// ... 
try 
{ 
    ThreadITD.Start(); 
    ThreadCTD.Start(); 
    // ... 
} 

編集:コメントに対応して

スレッドがすべて完了する前にもう一度タイマーが起動されないようにするには、タイマーを再開する前にスレッドに参加することをお勧めします。 Thread.Join()は、参照されたスレッドが終了するまでこのスレッドをスリープさせます。他のスレッドはすべて連続していません。

private void CsvGenFromDatabase(object sender, EventArgs e) 
{ 
    timerjob.stop(); 

    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew)) 
    { 
     Thread threadITD = new Thread(new ThreadStart(FileGenerationForITD)); 
     Thread threadCTD = new Thread(new ThreadStart(FileGenerationForCTD)); 
     Thread threadCID = new Thread(new ThreadStart(FileGenerationForCID)); 
     Thread threadFFM = new Thread(new ThreadStart(FileGenerationForFFM)); 

     threadITD.Start(); 
     threadCTD.Start(); 
     threadCID.Start(); 
     threadFFM.Start(); 

     threadITD.Join(); 
     threadCTD.Join(); 
     threadCID.Join(); 
     threadFFM.Join(); 

     scope.Complete(); 
    } 

    timerjob.start(); 
} 
+0

あなたは少し簡単に説明してください、私はスレッドがnullまたはそのような条件で停止したときだけ私はスレッドを開始するsayngです確認しています – pravz

+0

ちょうど1つのスレッドを見て、threadITDと言う。まず、 'threadITD = new Thread(...)'を宣言し、 'threadITD == null'について直ちにテストしました。その間に 'threadITD'がnullになることはありますか?それはできないので、テストは無意味です。第2に、 'new Thread'はデフォルトの' ThreadState = Unstarted'を持っています。これはどうやって変わるのですか? 'threadITD.Start()'または 'threadITD.Abort()'を呼び出すだけです。 'ThreadState'をテストする前にこれらのどちらも呼び出されないので、テストの結果は既に分かっています。基本的には、if文は保証された状態と既知の状態をテストするため、冗長です。 –

+0

別のインスタンスが起動しているのであれば、平均して既存のスレッドは妨害されるべきではないので、スレッドIDの前にチェックしています== nullこのような条件は間違っています。私の疑問は、上記のあなたの返信が1つのインスタンスがまだ開始されていると仮定していると仮定して更新された場合は、保留中の別のインスタンスがタイマーイベントによってインスタンス化されます。 – pravz

関連する問題