C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■88590 / )  Re[9]: フォームの連続的な書き換えに関して
□投稿者/ パヨンパヨン (3回)-(2018/09/09(Sun) 14:02:40)
ありがとうございます。

自分で速度比較を行ってみました。


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Dim sw As New Stopwatch
        sw.Reset()
        sw.Start()


        Task.Factory.StartNew(
               Sub()

                   For i = 1 To 10000

                       Dim s As Integer = i

                       '方法1
                       '  BeginInvoke(New Action(Of Control, Integer)(AddressOf SetText), TextBox1, s)     '40〜50ミリ秒

                       '方法2
                       ' BeginInvoke(Sub() SetText(Me.TextBox3, s))           '100〜120ミリ秒

                       '方法3
                       Invoke(New MethodInvoker(                '300ミリ秒
                           Sub()
                           End Sub))


                       '方法4
                       ' BeginInvoke(SetText_dgl, Me.TextBox1, s)         '50〜70ミリ秒


                   Next


                   frm.BeginInvoke(Sub() SetTextBox(Me.TextBox2, sw.ElapsedMilliseconds.ToString))

               End Sub)


    End Sub



以下は別のモジュール

    Delegate Sub delegate_SetText(TBox As TextBox, i As Integer)

    Public SetText_dgl As New delegate_SetText(AddressOf SetText)

    Public Sub SetText(TBox As TextBox, i As Integer)
        'TBox.Text = i.ToString()
    End Sub



ご指摘の通り、方法1の方が方法2よりもほぼ2倍速いことがわかりました。
方法3に至っては6倍くらい遅い結果となりました。
予め、delegateクラスを作成する方法4も比較してみましたが、
なぜか方法1よりも若干だけ遅くなる結果となりました。

ちなみに、本来ならテキストボックスに数値を表示するためのコードなのですが、
 'TBox.Text = i.ToString()
のコメントアウトを外すと以下のエラーが発生してしまいます。


マネージ デバッグ アシスタント 'DisconnectedContext' が 'D:\Documents and Settings\My Documents\xxx.exe' で問題を検出しました。

追加情報:この RuntimeCallableWrapper の COM コンテキスト 0xe8a5f8 への変換に失敗して、エラー システム コールに失敗しました。 (HRESULT からの例外:0x80010100 (RPC_E_SYS_CALL_FAILED)) が発生しました。これは、通常この RuntimeCallableWrapper が作成された COM コンテキスト 0xe8a5f8 が切断されたか、他の処理を実行していてビジーであることが原因です。現在の COM コンテキスト (COM コンテキスト 0xe8a6b0) からインターフェイスを解放しています。これは、破損またはデータの損失を発生させる可能性があります。この問題を回避するには、その内部に存在する COM コンポーネントを示す RuntimeCallableWrappers の使用が完了するまで、すべての COM コンテキスト、アパートメント、およびスレッドが完全に有効であり、コンテキスト変換に使用できることを確認してください。


また、このコメントアウトを外さなかったとしても、

 For i = 1 To 10000
のところを
 For i = 1 To 100000
に変更すると、同じエラーが発生します。

これは一体なぜでしょうか?
エラーが発生しないようにするにはどうしたら良いですか?

返信 編集キー/


管理者用

- Child Tree -