What's the difference between InvokeAsync and BeginInvoke for WPF Dispatcher

前端 未结 4 862
庸人自扰
庸人自扰 2020-12-08 13:09

I noticed in .NET 4.5 that the WPF Dispatcher had gotten a new set of methods to execute stuff on the Dispatcher\'s thread called InvokeAsync. Before, .NET 4.5 we had Invoke

4条回答
  •  一整个雨季
    2020-12-08 13:16

    There are no differences as the BeginInvoke method calls a private LegacyBeginInvokeImpl method which itslef calls the private method InvokeAsyncImpl (the method used by InvokeAsync). So it's basically the same thing. It seems like it's a simple refactoring, however it's strange the BeginInvoke methods weren't flagged as obsolete.

    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;
    }
    

提交回复
热议问题