0

デリゲート関数から値を取得しようとしています。基本的に、デリゲート関数からリッチボックステキストの行の長さを取得しようとしています。

これが私の機能です

Private Delegate Function getrichlengthmain(ByVal TB As RichTextBox) As String

Private Function getrichlenghtdele(ByVal TB As RichTextBox) As string

        Return TB.Lines.Length


End Function

そして、私はそれを

Dim d As getrichlengthmain

        d = AddressOf getrichlenghtdele

dim returnvalue as string

returnvalue = d.BeginInvoke(FstList,nothing,nothing)

このコードの 2 つの問題

第1の問題

コードを「returnvalue = d.BeginInvoke(FstList,nothing,nothing)」から「d.BeginInvoke(FstList,nothing,nothing)」に変更すると

デバッグ中のクロススレッド エラー ポップアウト

2番目の問題

クロス スレッド エラーを発生させずに関数から値を取得するにはどうすればよいですか。

お時間をいただきありがとうございます。解決していただきありがとうございます。

4

1 に答える 1

0

アクセスしようとしているコントロールが、アクセスしているスレッドとは別のスレッドで作成されているため、エラーが発生しています。これは、.Net でスレッド化された UI アプリケーションを開発するときによくある間違いです。

あなたが抱えている問題に取り組むには (少なくとも) 2 つの方法があります。怠惰な方法と正しい方法です。これを怠惰な方法で解決するには、UI コンポーネントのどこかに次のコード行を含めることで、コントロールへの不正なクロススレッド呼び出しのチェックが行われないようにするだけです。

Control.CheckForIllegalCrossThreadCalls = False

この問題に対処するより良い方法は、コードが正しいスレッドで実行されるようにすることです (したがって、スレッド セーフを維持します)。これを実現する方法の 1 つをここで説明します。

于 2013-08-01T13:26:18.090 に答える