DOBON.NET DOBON.NETプログラミング掲示板過去ログ

RaiseEventについて

  • 題名: RaiseEventについて
  • 著者: zono
  • 日時: 2008/02/07 16:42:54
  • ID: 21437
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[VB.NET(2003)]
分類:[.NET]

RaiseEventについてお聞きしたいことがありますのでよろしくお願いします。

オブジェクトBからオブジェクトAにイベントを発行しようとしています。
(オブジェクトBはオブジェクトAより生成)

普通にオブジェクトBがRaiseEventを発行すると、オブジェクトAのハンドラに
イベントが発行されるのですが、スレッドが切り離されないので、オブジェクト
Aのハンドラに記述されている処理が完了してからオブジェクトBのRaiseEvent
を発行したプロシージャにスレッドが戻ってきてしまいます。

目的としてはRaiseEventを発行した時にスレッドを切り離して、RaiseEventを発行したプロシージャのスレッドを終了したいことです。

スレッドクラスを生成することも考えたのですが、結局、スレッドクラスに登録したハンドラの処理で同様なことになってしまいます。

イベントをクラス間で発行するとき、スレッドを完全に切り離すことはできるのでしょうか??

もし分かる方がいらっしゃいましたらよろしくお願い致します。
たとえば、RaiseEvent するプロシージャをDelegate.BeginInvoke するとか。
要は非同期呼び出しすればよいと思います。
■No21439に返信(まどかさんの記事)
> たとえば、RaiseEvent するプロシージャをDelegate.BeginInvoke するとか。
> 要は非同期呼び出しすればよいと思います。

返信していただいてありがとうございます。
上記のようにしてもRaiseEvent するプロシージャ内にスレッドが戻ってきます。

例えばDelegate.BeginInvokeするプロシージャ内が

console.Writeline("START")

RaiseEvent msgsend("test")

console.WriteKine("START")

だったとすると結果は

START
イベント発行先のハンドラの処理
END

となってしまいます。(イベント先のハンドラ処理が終了してスレッドがもどってきてENDが出力される)
RaiseEventを発行したらスレッドを切り離し、ENDが出力されて欲しいのですが・・・

これだとスレッドクラスとあまり変わらないような気がします。

やはり教えていただいた方法かスレッドクラスを使用する方法しかないのでしょうか・・・
  • 題名: Re[3]: RaiseEventについて
  • 著者: zono
  • 日時: 2008/02/08 2:46:40
  • ID: 21442
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No21441に返信(zonoさんの記事)
> ■No21439に返信(まどかさんの記事)
>>たとえば、RaiseEvent するプロシージャをDelegate.BeginInvoke するとか。
>>要は非同期呼び出しすればよいと思います。
>
> 返信していただいてありがとうございます。
> 上記のようにしてもRaiseEvent するプロシージャ内にスレッドが戻ってきます。
>
> 例えばDelegate.BeginInvokeするプロシージャ内が
>
> console.Writeline("START")
>
> RaiseEvent msgsend("test")
>
> console.WriteKine("START")
>
> だったとすると結果は
>
> START
> イベント発行先のハンドラの処理
> END
>
> となってしまいます。(イベント先のハンドラ処理が終了してスレッドがもどってきてENDが出力される)
> RaiseEventを発行したらスレッドを切り離し、ENDが出力されて欲しいのですが・・・
>
> これだとスレッドクラスとあまり変わらないような気がします。
>
> やはり教えていただいた方法かスレッドクラスを使用する方法しかないのでしょうか・・・
>


すいません。

console.Writeline("START")

RaiseEvent msgsend("test")

console.WriteKine("START")

でなく

console.Writeline("START")

RaiseEvent msgsend("test")

console.WriteKine("END")

でした。
申し訳ございません。
> 上記のようにしてもRaiseEvent するプロシージャ内にスレッドが戻ってきます。
>
> 例えばDelegate.BeginInvokeするプロシージャ内が
> console.Writeline("START")
> RaiseEvent msgsend("test")
> console.WriteKine("END")
>
> RaiseEventを発行したらスレッドを切り離し、ENDが出力されて欲しいのですが・・・

RaiseEventするだけ、つまりRaiseEventの後に何も書かなければいいだけでは?

Private Sub OnMsgSend()
RaiseEvent MsgSend(Me, EventArgs.Empty)
End Sub

これをBeginInvokeすればOnMsgSendがスレッド処理にて非同期呼び出しされます。
つまり、
Private Sub EventRaiser()
_MsgSendDelegate.BeginInvoke(〜)
' Next Step
End Sub
Next StepがOnMsgSendの「呼び出しの完了」を受けて実行されます。
#RaiseEventの終了は待たない

そういうことではない?
  • 題名: Re[4]: RaiseEventについて
  • 著者: zono
  • 日時: 2008/02/18 20:46:40
  • ID: 21480
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No21444に返信(まどかさんの記事)
>>上記のようにしてもRaiseEvent するプロシージャ内にスレッドが戻ってきます。
>>
>>例えばDelegate.BeginInvokeするプロシージャ内が
>>console.Writeline("START")
>>RaiseEvent msgsend("test")
>>console.WriteKine("END")
>>
>>RaiseEventを発行したらスレッドを切り離し、ENDが出力されて欲しいのですが・・・
>
> RaiseEventするだけ、つまりRaiseEventの後に何も書かなければいいだけでは?
>
> Private Sub OnMsgSend()
> RaiseEvent MsgSend(Me, EventArgs.Empty)
> End Sub
>
> これをBeginInvokeすればOnMsgSendがスレッド処理にて非同期呼び出しされます。
> つまり、
> Private Sub EventRaiser()
> _MsgSendDelegate.BeginInvoke(〜)
> ' Next Step
> End Sub
> Next StepがOnMsgSendの「呼び出しの完了」を受けて実行されます。
> #RaiseEventの終了は待たない
>
> そういうことではない?

返信がおくれてしまい申し訳ございません。
色々調べた結果まとか様のおっしゃる通りの方法で目的は達成できます。

ただ同期処理であるRaiseEvent自体を非同期にできないのかと
思っていたので・・・

まどか様の教えて頂いた方法で解決の方向に進みたいと思います。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板