■.NETモジュールプロジェクト(DLL)
Public Class MyClass
Public Event hoge( ByVal sender As Object, ByVal e As EventArgs )
Private WithEvents Timer As Timers.Timer
Private Sub New()
Timer = New Timers.Timer : Timer.Interval = 10 : Timer.Start()
End Sub
Private Sub fuga( ByVal sender As Object, ByVal e As EventArgs ) Handles Timer.Elapsed
RaiseEvent hoge( Me, New EventArgs ) ' 一定時間ごとにイベントを発生させる
End Sub
End Class
■上の.NETモジュールを参照している Windows Form アプリケーションプロジェクト(EXE)
Public Class Form1
Private WithEvents foo As MyClass.MyClass
Public Sub New()
InitializeComponent()
foo = New MyClass.MyClass
End Sub
Private Sub bar() Handles foo.hoge
TextBox1.Text = "baz" ' TextBox1 は デザイナで Form1 に貼り付け済み
End Sub
End Class
という 2 プロジェクトを含むソリューションを作成しました。実行すると、
有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'TextBox1' がアクセスされました。
というエラーが出てきます。
foo が MyClass ではなく、system.windows.forms.dll などに入っている Button や Form といったコントロールの場合は、上記の bar() のような書き方でもスレッドセーフに扱えるので、MyClass もForm1 のコードを修正する事なく、利用できたらなと思っています。
その場合、どのように MyClass を書けばいいでしょうか。環境は VS2008 で、.NET2.0 ベースです。
お礼
遅くなりましたが回答ありがとうございました