我正在编写一个小型WPF应用程序,它会产生一些线程来对网站页面进行压力测试。我想在我从主WPF线程手动启动的线程的状态的wpf形式的文本框中输出一些信息。我有点期望WPF具有相同的功能,只要通过以下方式将我的线程同步回GUI线程:
if(this.InvokeRequired)
this.Invoke(ProcessState);
然而WPF中没有任何类型的东西......在WPF中从非gui线程做输出的选项是什么?
修改:
现在问题似乎在于我无法检查我控制的CheckAccess()
对象的方法Dispatcher
。我正在运行.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();
}
}
答案 0 :(得分:39)
在WPF中,它被移出Control / UIElement层次结构,并进入调度程序。
等同于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中,但它存在,并且它确实可以正常工作。
答案 1 :(得分:3)
如果您只是将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 });
}
}
答案 2 :(得分:1)
对我来说,每个Page,UserControl和Frame
都有效 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