• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C#でスレッド実行中のイベントについて)

C#でスレッド実行中のイベントについて

このQ&Aのポイント
  • C#でスレッド実行中のイベントについて知りたいです。
  • スレッドを直接起動するとイベントが正常に発生しますが、Invokeとデリゲートを使った場合にはイベントが発生しない問題があります。
  • Aplication.DoEvent()を使ってイベントを発生させることもできますが、Thread.Sleep()中はフリーズ状態になります。Invokeを使わずにスレッドの処理が終了するまでイベントが発生する方法が知りたいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> やりたいことは、コントロールにアクセスする重い処理を別スレッドにさせて、必要に応じて処理を即時中断したいだけなんですけど…。 基本的にはBackgroundWorkerで可能です。 即時中断は無理で,スレッド側でキャンセルを随時調べることになります。 こうしないと,終了してはいけないところで終了する可能性があるためです。 > BackgroundWorkerを試したのですが、こちらは直接スレッドを起動した時と同様にコントロールにアクセスできない様ですし…。 ReportProgressとProgressChangedイベントを使ってください。 ・DoWorkイベントはワーカースレッド上で実行されます。 ・ProgressChangedイベントとRunWorkerCompletedイベントはUIスレッド上で実行されます。 どちらのスレッドで発生するかを気にしてコードを書く必要があります。 > BeginInvokeも試してみましたがInvoke同様、イベントは発生しませんでした。 > 何か使い方が間違っているのでしょうか?? デリゲート自体のBeginInvokeを利用しましたか。 ControlのBeginInvokeはワーカースレッド側をブロックせずにデリゲートをUIスレッド上で実行するための機構です。

mark225
質問者

お礼

いろいろと詳しい説明をして頂き、有り難うございます。 初めてのコマンドばかりですのでちょっとハードルが高そうですが、BackgroundWorkerでやってみます。 追伸、 ちょっと前にこれに関連の新質問を投稿したのですが、今後のためにこちらも回答頂けると嬉しいです。

その他の回答 (2)

回答No.2

えーっと,Invokeというのは, ・DelegateのInvoke (C#から直接呼び出し不可,()演算子でコンパイラが読み替える) ・ControlのInvoke のどちらでしょうか。 まず,DelegateのInvokeはそのスレッド上でデリゲートを実行します。 このため,イベントハンドラ上でDelegate.Invokeを呼び出した場合,UIスレッドをブロックします。 次に,ControlのInvokeはそのデリゲートをUIスレッド上で動かすための仕組みです。 この時,他のスレッドから呼び出した場合はデリゲートの実行が終わるまで呼び出し元のスレッドの実行をブロックします。 UIスレッドから呼び出した場合は,単純にDelegateを実行します。 また,デリゲートは実行中UIスレッドを専有します。 このため,どちらであってもデリゲートの終了までUIスレッド上でUIのイベントは原則発生しません。 デリゲートを別スレッドで実行するには,BeginInvokeを使います。 #1の方の書かれたBackgroundWorkerの方が,簡単ではありますが。 # 多段呼び出ししないようにだけ注意が必要。

mark225
質問者

お礼

回答、有り難うございました。 C#って本当に深いですねぇ。 デリゲートとかInvokeとか、見よう見まねで使っているだけですので内容については正直、理解できていないです。 やりたいことは、コントロールにアクセスする重い処理を別スレッドにさせて、必要に応じて処理を即時中断したいだけなんですけど…。 BackgroundWorkerを試したのですが、こちらは直接スレッドを起動した時と同様にコントロールにアクセスできない様ですし…。 BeginInvokeも試してみましたがInvoke同様、イベントは発生しませんでした。 何か使い方が間違っているのでしょうか??

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

そういう時にはInvokeじゃなくてBackGroundWorkerを使うもんじゃないかと。 http://msdn.microsoft.com/ja-jp/library/system.componentmodel.backgroundworker(v=vs.80).aspx

mark225
質問者

お礼

早速の回答、有り難うございます。 BackGroundWorkerですか…。 使ったことのないクラスなのでこれから調べてみます。

関連するQ&A

専門家に質問してみよう