在WPF中Control.InvokeRequired发生了什么?

我正在编写一个小型WPF应用程序,它会产生一些线程来对网站页面进行压力测试。 我想在我从主WPF线程手动启动的线程的状态的wpfforms的文本框中输出一些信息。 我有点期望WPF具有相同的function,只要通过以下方式将我的线程同步回GUI线程:

if(this.InvokeRequired) this.Invoke(ProcessState); 

但是WPF中没有任何类型的东西……在WPF中从非gui线程输出的选项是什么?

编辑:问题现在似乎是因为我无法检查我的控件的Dispatcher对象的方法CheckAccess() 。 我正在运行.net和VS 2008 SP1的3.5版本。

这是我的Dispatcher类的完整元数据(F12就可以了):

  using MS.Internal.WindowsBase; using System; using System.ComponentModel; using System.Security; using System.Threading; namespace System.Windows.Threading { // Summary: // Provides services for managing the queue of work items for a thread. public sealed class Dispatcher { // Summary: // Gets the System.Windows.Threading.Dispatcher for the thread currently executing // and creates a new System.Windows.Threading.Dispatcher if one is not already // associated with the thread. // // Returns: // The dispatcher associated with the current thread. public static Dispatcher CurrentDispatcher { get; } // // Summary: // Determines whether the System.Windows.Threading.Dispatcher has finished shutting // down. // // Returns: // true if the dispatcher has finished shutting down; otherwise, false. public bool HasShutdownFinished { get; } // // Summary: // Determines whether the System.Windows.Threading.Dispatcher is shutting down. // // Returns: // true if the System.Windows.Threading.Dispatcher has started shutting down; // otherwise, false. public bool HasShutdownStarted { get; } // // Summary: // Gets the collection of hooks that provide additional event information about // the System.Windows.Threading.Dispatcher. // // Returns: // The hooks associated with this System.Windows.Threading.Dispatcher. [EditorBrowsable(EditorBrowsableState.Advanced)] public DispatcherHooks Hooks { get; } // // Summary: // Gets the thread this System.Windows.Threading.Dispatcher is associated with. // // Returns: // The thread. public Thread Thread { get; } // Summary: // Occurs when the System.Windows.Threading.Dispatcher finishes shutting down. public event EventHandler ShutdownFinished; // // Summary: // Occurs when the System.Windows.Threading.Dispatcher begins to shut down. public event EventHandler ShutdownStarted; // // Summary: // Occurs when a thread exception is thrown and uncaught during execution of // a delegate by way of Overload:System.Windows.Threading.Dispatcher.Invoke // or Overload:System.Windows.Threading.Dispatcher.BeginInvoke. public event DispatcherUnhandledExceptionEventHandler UnhandledException; // // Summary: // Occurs when a thread exception is thrown and uncaught during execution of // a delegate by way of Overload:System.Windows.Threading.Dispatcher.Invoke // or Overload:System.Windows.Threading.Dispatcher.BeginInvoke when in the filter // stage. public event DispatcherUnhandledExceptionFilterEventHandler UnhandledExceptionFilter; public DispatcherOperation BeginInvoke(Delegate method, params object[] args); // // Summary: // Executes the specified delegate asynchronously at the specified priority // on the thread the System.Windows.Threading.Dispatcher is associated with. // // Parameters: // priority: // The priority, relative to the other pending operations in the System.Windows.Threading.Dispatcher // event queue, the specified method is invoked. // // method: // The delegate to a method that takes no arguments, which is pushed onto the // System.Windows.Threading.Dispatcher event queue. // // Returns: // An object, which is returned immediately after Overload:System.Windows.Threading.Dispatcher.BeginInvoke // is called, that can be used to interact with the delegate as it is pending // execution in the event queue. // // Exceptions: // System.ArgumentNullException: // method is null. // // System.ComponentModel.InvalidEnumArgumentException: // priority is not a valid System.Windows.Threading.DispatcherPriority. [EditorBrowsable(EditorBrowsableState.Never)] [Browsable(false)] public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method); public DispatcherOperation BeginInvoke(Delegate method, DispatcherPriority priority, params object[] args); // // Summary: // Executes the specified delegate asynchronously at the specified priority // and with the specified argument on the thread the System.Windows.Threading.Dispatcher // is associated with. // // Parameters: // priority: // The priority, relative to the other pending operations in the System.Windows.Threading.Dispatcher // event queue, the specified method is invoked. // // method: // A delegate to a method that takes one argument, which is pushed onto the // System.Windows.Threading.Dispatcher event queue. // // arg: // The object to pass as an argument to the specified method. // // Returns: // An object, which is returned immediately after Overload:System.Windows.Threading.Dispatcher.BeginInvoke // is called, that can be used to interact with the delegate as it is pending // execution in the event queue. // // Exceptions: // System.ArgumentNullException: // method is null. // // System.ComponentModel.InvalidEnumArgumentException: // priority is not a valid System.Windows.Threading.DispatcherPriority. [EditorBrowsable(EditorBrowsableState.Never)] [Browsable(false)] public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method, object arg); // // Summary: // Executes the specified delegate asynchronously at the specified priority // and with the specified array of arguments on the thread the System.Windows.Threading.Dispatcher // is associated with. // // Parameters: // priority: // The priority, relative to the other pending operations in the System.Windows.Threading.Dispatcher // event queue, the specified method is invoked. // // method: // A delegate to a method that takes multiple arguments, which is pushed onto // the System.Windows.Threading.Dispatcher event queue. // // arg: // The object to pass as an argument to the specified method. // // args: // An array of objects to pass as arguments to the specified method. // // Returns: // An object, which is returned immediately after Overload:System.Windows.Threading.Dispatcher.BeginInvoke // is called, that can be used to interact with the delegate as it is pending // execution in the System.Windows.Threading.Dispatcher queue. // // Exceptions: // System.ArgumentNullException: // method is null. // // System.ComponentModel.InvalidEnumArgumentException: // System.Windows.Threading.DispatcherPriority is not a valid priority. [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)] public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method, object arg, params object[] args); // // Summary: // Initiates shutdown of the System.Windows.Threading.Dispatcher asynchronously. // // Parameters: // priority: // The priority at which to begin shutting down the dispatcher. [SecurityCritical] public void BeginInvokeShutdown(DispatcherPriority priority); // // Summary: // Determines whether the calling thread is the thread associated with this // System.Windows.Threading.Dispatcher. // // Returns: // true if the calling thread is the thread associated with this System.Windows.Threading.Dispatcher; // otherwise, false. [EditorBrowsable(EditorBrowsableState.Never)] public bool CheckAccess(); // // Summary: // Disables processing of the System.Windows.Threading.Dispatcher queue. // // Returns: // A structure used to re-enable dispatcher processing. public DispatcherProcessingDisabled DisableProcessing(); // // Summary: // Requests that all frames exit, including nested frames. [SecurityCritical] public static void ExitAllFrames(); // // Summary: // Gets the System.Windows.Threading.Dispatcher for the specified thread. // // Parameters: // thread: // The thread to obtain the System.Windows.Threading.Dispatcher from. // // Returns: // The dispatcher for thread. public static Dispatcher FromThread(Thread thread); public object Invoke(Delegate method, params object[] args); // // Summary: // Executes the specified delegate synchronously at the specified priority on // the thread on which the System.Windows.Threading.Dispatcher is associated // with. // // Parameters: // priority: // The priority, relative to the other pending operations in the System.Windows.Threading.Dispatcher // event queue, the specified method is invoked. // // method: // A delegate to a method that takes no arguments, which is pushed onto the // System.Windows.Threading.Dispatcher event queue. // // Returns: // The return value from the delegate being invoked or null if the delegate // has no return value. // // Exceptions: // System.ArgumentException: // priority is equal to System.Windows.Threading.DispatcherPriority.Inactive. // // System.ComponentModel.InvalidEnumArgumentException: // priority is not a valid priority. // // System.ArgumentNullException: // method is null. [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)] public object Invoke(DispatcherPriority priority, Delegate method); public object Invoke(Delegate method, DispatcherPriority priority, params object[] args); public object Invoke(Delegate method, TimeSpan timeout, params object[] args); // // Summary: // Executes the specified delegate at the specified priority with the specified // argument synchronously on the thread the System.Windows.Threading.Dispatcher // is associated with. // // Parameters: // priority: // The priority, relative to the other pending operations in the System.Windows.Threading.Dispatcher // event queue, the specified method is invoked. // // method: // A delegate to a method that takes one argument, which is pushed onto the // System.Windows.Threading.Dispatcher event queue. // // arg: // An object to pass as an argument to the given method. // // Returns: // The return value from the delegate being invoked or null if the delegate // has no return value. // // Exceptions: // System.ArgumentException: // priority is equal to System.Windows.Threading.DispatcherPriority.Inactive. // // System.ComponentModel.InvalidEnumArgumentException: // priority is not a valid priority. // // System.ArgumentNullException: // method is null. [EditorBrowsable(EditorBrowsableState.Never)] [Browsable(false)] public object Invoke(DispatcherPriority priority, Delegate method, object arg); // // Summary: // Executes the specified delegate synchronously at the specified priority and // with the specified time-out value on the thread the System.Windows.Threading.Dispatcher // was created. // // Parameters: // priority: // The priority, relative to the other pending operations in the System.Windows.Threading.Dispatcher // event queue, the specified method is invoked. // // timeout: // The maximum time to wait for the operation to finish. // // method: // The delegate to a method that takes no arguments, which is pushed onto the // System.Windows.Threading.Dispatcher event queue. // // Returns: // The return value from the delegate being invoked or null if the delegate // has no return value. [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)] public object Invoke(DispatcherPriority priority, TimeSpan timeout, Delegate method); public object Invoke(Delegate method, TimeSpan timeout, DispatcherPriority priority, params object[] args); // // Summary: // Executes the specified delegate at the specified priority with the specified // arguments synchronously on the thread the System.Windows.Threading.Dispatcher // is associated with. // // Parameters: // priority: // The priority, relative to the other pending operations in the System.Windows.Threading.Dispatcher // event queue, the specified method is invoked. // // method: // A delegate to a method that takes multiple arguments, which is pushed onto // the System.Windows.Threading.Dispatcher event queue. // // arg: // An object to pass as an argument to the given method. // // args: // An array of objects to pass as arguments to the given method. // // Returns: // The return value from the delegate being invoked or null if the delegate // has no return value. // // Exceptions: // System.ArgumentException: // priority is equal to System.Windows.Threading.DispatcherPriority.Inactive. // // System.ComponentModel.InvalidEnumArgumentException: // priority is not a valid priority. // // System.ArgumentNullException: // method is null. [EditorBrowsable(EditorBrowsableState.Never)] [Browsable(false)] public object Invoke(DispatcherPriority priority, Delegate method, object arg, params object[] args); // // Summary: // Executes the specified delegate at the specified priority with the specified // argument synchronously on the thread the System.Windows.Threading.Dispatcher // is associated with. // // Parameters: // priority: // The priority, relative to the other pending operations in the System.Windows.Threading.Dispatcher // event queue, the specified method is invoked. // // timeout: // The maximum time to wait for the operation to finish. // // method: // A delegate to a method that takes multiple arguments, which is pushed onto // the System.Windows.Threading.Dispatcher event queue. // // arg: // An object to pass as an argument to the given method. This can be null if // no arguments are needed. // // Returns: // The return value from the delegate being invoked or null if the delegate // has no return value. // // Exceptions: // System.ArgumentException: // priority is equal to System.Windows.Threading.DispatcherPriority.Inactive. // // System.ComponentModel.InvalidEnumArgumentException: // priority is not a valid priority. // // System.ArgumentNullException: // method is null. [EditorBrowsable(EditorBrowsableState.Never)] [Browsable(false)] public object Invoke(DispatcherPriority priority, TimeSpan timeout, Delegate method, object arg); // // Summary: // Executes the specified delegate at the specified priority with the specified // arguments synchronously on the thread the System.Windows.Threading.Dispatcher // is associated with. // // Parameters: // priority: // The priority, relative to the other pending operations in the System.Windows.Threading.Dispatcher // event queue, the specified method is invoked. // // timeout: // The maximum time to wait for the operation to finish. // // method: // A delegate to a method that takes multiple arguments, which is pushed onto // the System.Windows.Threading.Dispatcher event queue. // // arg: // An object to pass as an argument to the specified method. // // args: // An array of objects to pass as arguments to the specified method. // // Returns: // The return value from the delegate being invoked or null if the delegate // has no return value. // // Exceptions: // System.ArgumentException: // priority is equal to System.Windows.Threading.DispatcherPriority.Inactive. // // System.ComponentModel.InvalidEnumArgumentException: // priority is not a valid System.Windows.Threading.DispatcherPriority. // // System.ArgumentNullException: // method is null. [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)] public object Invoke(DispatcherPriority priority, TimeSpan timeout, Delegate method, object arg, params object[] args); // // Summary: // Initiates the shutdown process of the System.Windows.Threading.Dispatcher // synchronously. [SecurityCritical] public void InvokeShutdown(); // // Summary: // Enters an execute loop. // // Parameters: // frame: // The frame for the dispatcher to process. // // Exceptions: // System.ArgumentNullException: // frame is null. // // System.InvalidOperationException: // System.Windows.Threading.Dispatcher.HasShutdownFinished is true -or- frame // is running on a different System.Windows.Threading.Dispatcher. -or- Dispatcher // processing has been disabled. [SecurityCritical] public static void PushFrame(DispatcherFrame frame); // // Summary: // Pushes the main execution frame on the event queue of the System.Windows.Threading.Dispatcher. [SecurityCritical] public static void Run(); // // Summary: // Determines whether the specified System.Windows.Threading.DispatcherPriority // is a valid priority. // // Parameters: // priority: // The priority to check. // // parameterName: // A string that will be returned by the exception that occurs if the priority // is invalid. // // Exceptions: // System.ComponentModel.InvalidEnumArgumentException: // priority is not a valid System.Windows.Threading.DispatcherPriority. public static void ValidatePriority(DispatcherPriority priority, string parameterName); // // Summary: // Determines whether the calling thread has access to this System.Windows.Threading.Dispatcher. // // Exceptions: // System.InvalidOperationException: // The calling thread does not have access to this System.Windows.Threading.Dispatcher. [EditorBrowsable(EditorBrowsableState.Never)] public void VerifyAccess(); } 

}

在WPF中,它被移出Control / UIElement层次结构,并进入调度程序。

Equivelent是Dispatcher.CheckAccess和Dispatcher.Invoke 。

你应该能够做到:

 if (someControl.Dispatcher.CheckAccess()) UpdateUI(); else someControl.Dispatcher.Invoke(new Action(UpdateUI)); 

您的元数据包括:

 // // Summary: // Determines whether the calling thread is the thread associated with this // System.Windows.Threading.Dispatcher. // // Returns: // true if the calling thread is the thread associated with this System.Windows.Threading.Dispatcher; // otherwise, false. [EditorBrowsable(EditorBrowsableState.Never)] public bool CheckAccess(); 

这是你想要使用的方法……它没有出现在Intellisense中,但是它存在,并且它确实可以正常工作。

如果您只是将WinForm Invoke转换为WPF Dispatch,则只需进行一些小的更改即可将WinForm代码转换为WPF代码。 这适用于我的控件名为“_connection”,并被重写为在WPF应用程序中工作。

 // ---- Original WinForm code ---- delegate void SetIndicatorCallback(bool bVal); private void SetIndicator(bool bVal) { if (this._connection.InvokeRequired) { SetIndicatorCallback d = new SetIndicatorCallback(SetIndicator); this.Invoke(d, new object[] { bVal }); } else { if (bVal) { // Change the control's color, or whatever action is required. } } } // ---- WPF ---- // Still using a delegate delegate void SetIndicatorCallback(bool bVal); private void SetIndicator(bool bVal) { if (this._connection.Dispatcher.CheckAccess()) { if (bVal) { // Change the control' color, or whatever action is needed. } } else { SetIndicatorCallback d = new SetIndicatorCallback(SetIndicator); this.Dispatcher.BeginInvoke(d, new object[] { bVal }); } } 

对我来说,每个页面,UserControl和框架都有效

  Implements IDisposable 'Code is implemented automatically Public Sub New() ' This call is required by the designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. AddHandler Me.Dispatcher.ShutdownStarted, AddressOf Me_HasShutDownStarted End Sub Private Sub Me_HasShutDownStarted(ByVal sender As Object, ByVal e As System.EventArgs) If Me.disposedValue = False Then Call Me.Dispose() End Sub