16

Winforms では、すべてのコントロールにInvokeRequiredプロパティがあり、コントロールを変更するために .[Begin]Invoke を呼び出す必要がある場合に true を返します。

DispatcherObject.CheckAccess()WPF では、 andに明らかに似た構造がありますDispatcher.CheckAccess()が、私はそのEditorBrowsable(EditorBrowsableState.Never)属性に怯えています。このようにエディターのブラウジングを無効にすると、「これを行うべきではありません。いや、本当に。これが差し迫った問題を解決する必要がある場合、包括的な問題に対するソリューションの設計を誤っています」という意味で使用します。一方、私が見つけた唯一の代替手段 (そして実際、私の元の解決策) はThread.CurrentThread.ManagedThreadId == 1. (これは恐ろしいことです。そして、一般的なケースでは機能しません。私は知っています。ただし、私の限られた用途では機能します。)

MSDNドキュメントEditorBrowsableは、属性の存在と背後にある理由について沈黙しています。それは本当に「これを使用しないでください」という意味ですか?

4

2 に答える 2

23

WPF ではDispatcher.Invoke、現在のスレッドに関係なく呼び出すことができ、それに応じて呼び出しを処理します。既に適切なスレッドにいる場合は、コードを呼び出すだけで、CheckAccessこの動作を処理するために使用されます。

現在使用してBeginInvokeいるスレッドは無関係です。BeginInvoke常に非同期であり、実行の順序は、ディスパッチャーのキューに追加するアイテムの優先度に依存します。

メソッドをまったく使用しない場合は、パブリックにはなりません。その属性の目的は、Intellisense やその他のエディター ブラウザーなどのメカニズムからメンバーを隠すことだけです。通常、自分自身を使用する必要はありませんDispatcher.CheckAccess()。おそらくそれがブラウズ不可としてマークされている理由ですが、これの知恵は推測することしかできません (Eric Lippert が見ている場合を除きます ;-)

要約Dispatcher.Invokeすると、心配する必要はありませんCheckAccess

于 2012-10-17T15:59:11.627 に答える
0

If invokeRequired then追加します: " ..."を模倣したい場合は、次のように
言います: " " は使用しないでくださいif Dispatcher.CheckAccess。代わりに:

If Me.Dispatcher.Thread Is System.Threading.Thread.CurrentThread Then
    Label1.Content = value
Else
    Me.Dispatcher.BeginInvoke(New Action(Of String)(AddressOf displaymessage), value)
    Return
End If


私が抱えていた問題は、呼び出しが開始された後でも、CheckAccessが常にtrueであったことでした...

次のコードも問題なく動作します。

   If Me.Dispatcher.CheckAccess Then
    Label1.Content = value 
  Else
    Me.Dispatcher.BeginInvoke(New Action(Of String)(AddressOf displaymessage), value)
    Return
End If
于 2013-01-21T18:33:29.567 に答える