2011-01-30 19 views
0

スレッドがコードの実行を開始する直前および実行が完了した直後に、特定のアプリケーションドメインで実行されている各スレッド(コードの生成方法に関係なく)で実行する必要があるコード部分があります。スレッドが完了したイベントと完了したイベント

System.ComponentModel.BackgroundWorkerクラスには、必要な2番目のイベントと同じイベントがあります(表を参照)。

 
┌───────────┬────────────────────────┬─────────────────────────────────────────────────────────────────────────┐ 
│ ? class │ BackgroundWorker class │ Description                │ 
├───────────┼────────────────────────┼─────────────────────────────────────────────────────────────────────────┤ 
│ Ready  │ -      │ Operation execution is about to start.         │ 
├───────────┼────────────────────────┼─────────────────────────────────────────────────────────────────────────┤ 
│ ?   │ DoWork     │ Execute operation.              │ 
├───────────┼────────────────────────┼─────────────────────────────────────────────────────────────────────────┤ 
│ ?   │ ProgressChanged  │ Notify about progress in execution of operation.      │ 
├───────────┼────────────────────────┼─────────────────────────────────────────────────────────────────────────┤ 
│ Completed │ RunWorkerCompleted  │ Operation has completed, has been cancelled or has raised an exception. │ 
└───────────┴────────────────────────┴─────────────────────────────────────────────────────────────────────────┘ 

前のテーブルからを完了し、このような準備などのイベントはありますか?私はそのような出来事がSystem.Threading.Threadでも見られませんでした。でもでもSystem.AppDomainクラスです。

答えて

1

新しいスレッドを開始するにはさまざまな方法があります。スレッドプールはQueueUserWorkItemBackgroundWorkerだけでなく、非同期委任呼び出しを行うコードでも使用されます。また、とEnd...Stream.BeginReadStream.EndRead開始スレッドと終了スレッドのような非同期の処理を行う方法。もちろん、マネージスレッドを使用する場合は標準Thread.Start()があります。タスク並列ライブラリがあります。 。 。

もちろん、Windows APIを使って直接スレッドを開始する方法はたくさんあります。

Windows APIの可能性を無視しても、アクティビティを監視できるように、さまざまなメカニズムをフックするよう依頼しています。管理対象のスレッド関数だけでなく、作業項目を開始および終了するスレッドプール関数をフックする必要があります。

この問題の一般的な解決策は、ランタイムライブラリに深刻な洞察を呼びかけることと、管理されていないコードですべての方法で厄介な文書化されていないことをすることなしにはおそらく不可能です。それでも、私はそれができると確信していません。あなたが必要とするフックは露出していません。

Windows APIの可能性を含める場合は...うーん、幸運。

+0

残念ながら、あなたはおそらく正しいでしょう。提供された情報をありがとうございます。 –

2

私が正しく理解していれば、DoWorkの開始時またはその前にイベントが必要です。

あなたが簡単にすぐワーカースレッドからDoWorkの開始時に、呼び出し元のスレッド

  • から、ちょうどRunWorkerAsync前方法

    • を呼び出すことができるため、イベントモデルはこれをptovideしません。

    したがって、このようなイベントの明確なケースはありませんでした。

  • +0

    コードの実行前後にコードを実行する必要があります。 Thread.Startの呼び出し後、任意のデリゲート呼び出しのためにThreadを生成し、QueueUserWorkItemメソッド呼び出しを介して実行するためにQueuedメソッドを実行するThreadPoolによってスレッドが生成されるため、あなたが提案している解決策は完全ではありません。 –

    関連する問題