2016-12-28 1 views
1

イベントからフォームをロードするときにフォームのフリーズに問題が発生しました。私はそれがスレッディングと関係があると思っていますが、悲しいことに私はそれを自分自身で解決するには十分に分かりません:(vb.netフォームフリーズ、スレッド、イベント、混乱したnoob

私のプロジェクトを説明しましょう: 私はネットワークのイベントにフックするクラスを持っています例えば)、私はフォームでインスタンス化してきた が、そこからいくつかのイベントを宣言した。

Public Netstat As New aaNetTool.clsNetworkStatus 

AddHandler Netstat.NetworkChanged, AddressOf Network_Changed 

Sub Network_Changed() 

End Sub 

を私は通知にフォームを表示するために使用する別のクラス、clsMessageを書いた後。

Public Class clsMessage 
    Private myForm As frmDisplayMessage 

    Public Sub New(ByVal Title$, ByVal Text$, Optional btnYesAction As Action = Nothing, Optional ByVal ShowTimeSec% = 10) 
     myForm = New frmDisplayMessage 
     myForm.Text = Title 
     myForm.lblText.Text = Text 
     (...) 
     myForm.Show() 
     (...) 
    End Sub 

今、私はこのようなメインフォームからボタンを押して、デバッグのためのEW通知ウィンドウ:

Dim myMsg As New clsMessage("title", "text", AddressOf MapNetworkdrives, 30) 

これは魔法のように動作します。私は私の宣言イベントから通知を呼び出すとき

は、しかし:通知と

Sub Network_Changed() 
     Dim myMsg As New clsMessage("title", "text", AddressOf MapNetworkdrives, 30) 
End Sub 

フォームが表示されますが、空とフリーズです。 としてはLunex

、私はこれは私のコードは、別のスレッドで実行されているとしなければならないかもしれませんが、私はこれを解決する方法:(あなたの時間を事前に

感謝を把握することはできませんだと思う前に言いました

+0

Imports System.Runtime.CompilerServices Public Module Extensions <Extension()> _ Public Sub InvokeIfRequired(ByVal Control As Control, ByVal Method As Action) If Control.InvokeRequired = True Then Control.Invoke(Method) 'Invoke the method thread-safely. Else Method.Invoke() 'Call the method normally (equal to just calling: 'Method()'). End If End Sub End Module 

次に、あなたがこのようにそれを使うだろう。あなたの 'Network_Changed'メソッドで(Me.InvokeRequired.ToString())'を表示しますか? –

+0

ITはInvokeRequired = trueを示しています。 – Lunex

+0

これは、 'Network_Changed'メソッドが別のスレッドで実行され、UIスレッドにアクセスするために呼び出さなければならないことを意味します。 –

答えて

1

clsNetworkStatus.NetworkChangedイベントがあなたの通知書は、UIの一部であるため、あなたはそれがUIスレッドの下で実行されるように起動する必要があります。バックグラウンドスレッドから上げているように見える。

InvokeRequired propertyは、あなたが起動したりする必要があるかどうかを示しますそうでなければ、Falseコードは既にUIスレッドで実行されています。あなたはあなたのためのチェックを行うために拡張メソッドを作成することができます

:あなたは `メッセージボックスを置けば、それはあなたが表示されない何

Sub Network_Changed() 
    Me.InvokeIfRequired(Sub() 
              Dim myMsg As New clsMessage("title", "text", AddressOf MapNetworkdrives, 30) 
             End Sub) 
End Sub 
+0

'Me.InvokeIfRequired(Sub()** Dim myMsg as New clsMessage( "title"、 "text"、AddressOf MapNetworkdrives、30))**' 太字部分がエラーをスローするステートメントはシングルラインでは無効ですステートメント – Lunex

+0

また、私は簡単なコマンドを呼び出す方法を知っていますが、パラメータを使ってクラスの宣言とインスタンス化を呼び出す方法はありますか? – Lunex

+0

@ルネックス:今すぐ試して、私は答えを編集しました。 –