2011-03-25 50 views
18

我正在写一个小的WPF应用程序,它会产生一些线程来压力测试一个网站的页面。我想在线程状态的WPF形式的文本框中输出一些信息,我手动从主WPF线程开始。我是那种期待的WPF具有相同的功能,只要通过同步我的线程回GUI线程:WPF中的Control.InvokeRequired发生了什么?

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

但是没有什么的种类在WPF的......什么是选项从WPF中的非gui线程输出?

编辑: 现在的问题似乎是事实,我不能检查我的控制Dispatcher对象的方法CheckAccess()。我正在运行.net和VS 2008 SP1的3.5版本。

这是我的分派器类(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(); 
} 

}

回答

35

在WPF中,这被移出控制/的UIElement层次,并进入调度。

等效为Dispatcher.CheckAccessDispatcher.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(); 

这是您要使用的方法......这不露面智能感知,但它在那里,它确实工作正常。

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 
+0

@Reed,我怀疑bc的事实,我在3.5以下的事实没有控件的Dispatcher类的CheckAccess(),任何想法? – dexter 2011-03-25 18:15:28

+2

@乍得谁爱我:它应该存在:http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.checkaccess(v=VS.90).aspx(这是3.5版本)如果你想使用Dispatcher,请确保添加'using System.Windows.Threading;'。 – 2011-03-25 18:20:51

+0

@Reed,我没有将该程序集作为添加引用的.net的一部分列出。它隐藏在.net框架的某个地方吗? – dexter 2011-03-25 18:35:18

1

对我来说工作码。这对我的名为“_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 }); 
     } 
    } 
3

如果你只是转换的WinForm调用到到WPF调度,需要只是一些小的改动你的WinForm的代码转换为WPF的每一页,用户控件和框架上