1. ホーム
  2. c#

WPF DispatcherのInvokeAsyncとBeginInvokeの違いとは?

2023-09-14 16:23:55

質問

私は、.NET 4.5において WPF ディスパッチャ という Dispatcher のスレッドで何かを実行するための新しいメソッドのセットを得たことに気づきました。 InvokeAsync . 以前、.NET 4.5 では インボーク 開始 で、それぞれ同期と非同期で処理します。

名前付けと利用可能なオーバーロードが若干異なる以外に、このように BeginInvokeInvokeAsync のメソッドを使用しますか?

あ、もう確認したんですが、どちらも await になっています。

private async Task RunStuffOnUiThread(Action action)
{
    // both of these works fine
    await dispatcher.BeginInvoke(action);
    await dispatcher.InvokeAsync(action);
}

どのように解決するのですか?

のように違いはありません。 BeginInvoke メソッドはプライベートな LegacyBeginInvokeImpl メソッドを呼び出し、そのメソッド自身がプライベートなメソッド InvokeAsyncImpl (で使われるメソッド)。 InvokeAsync ). つまり、基本的には同じことなのです。単純なリファクタリングのように見えますが、しかし不思議なことに BeginInvoke メソッドが廃止されたというフラグが立っていないのは不思議です。

BeginInvoke 。

public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method)
{
    return this.LegacyBeginInvokeImpl(priority, method, null, 0);
}

private DispatcherOperation LegacyBeginInvokeImpl(DispatcherPriority priority, Delegate method, object args, int numArgs)
{
    Dispatcher.ValidatePriority(priority, "priority");
    if (method == null)
    {
        throw new ArgumentNullException("method");
    }
    DispatcherOperation dispatcherOperation = new DispatcherOperation(this, method, priority, args, numArgs);
    this.InvokeAsyncImpl(dispatcherOperation, CancellationToken.None);
    return dispatcherOperation;
}

InvokeAsync :

public DispatcherOperation InvokeAsync(Action callback, DispatcherPriority priority)
{
    return this.InvokeAsync(callback, priority, CancellationToken.None);
}

public DispatcherOperation InvokeAsync(Action callback, DispatcherPriority priority, CancellationToken cancellationToken)
{
    if (callback == null)
    {
        throw new ArgumentNullException("callback");
    }
    Dispatcher.ValidatePriority(priority, "priority");
    DispatcherOperation dispatcherOperation = new DispatcherOperation(this, priority, callback);
    this.InvokeAsyncImpl(dispatcherOperation, cancellationToken);
    return dispatcherOperation;
}