Подтвердить что ты не робот

Что случилось с Control.InvokeRequired в WPF?

Я пишу небольшое приложение WPF, которое порождает некоторое количество потоков, чтобы подчеркнуть страницу страницы. Я хотел бы вывести некоторую информацию в текстовое поле формы wpf состояния потока, которое я вручную начинаю с основного потока WPF. Я ожидал, что WPF будет иметь те же возможности, что и синхронизация моих потоков с потоком GUI через:

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

Однако в WPF ничего не существует... Каковы опции для вывода из потока non-gui в WPF?

Edit: Теперь проблема заключается в том, что я не могу проверить метод CheckAccess() объекта Dispatcher моего элемента управления. Я запускаю 3.5 версию .net и VS 2008 SP1.

Вот полные метаданные моего Диспетчерского класса (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();
}

}

4b9b3361

Ответ 1

В 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, но он есть, и он работает правильно.

Ответ 2

Если вы просто конвертируете 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 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

Для меня, который работал на каждой странице, 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