Non ci sono differenze come metodo BeginInvoke
chiama un LegacyBeginInvokeImpl
metodo privato che itslef chiama il metodo privato InvokeAsyncImpl
(il metodo usato da InvokeAsync
). Quindi è praticamente la stessa cosa. Sembra che sia un semplice refactoring, tuttavia è strano che i metodi BeginInvoke
non siano stati contrassegnati come obsoleti.
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;
}
Attualmente sto ottenendo eccezioni non gestite che funzionano come previsto utilizzando BeginInvoke (attivando sia DispatcherUnh andledException sul dispatcher e AppDomain.CurrentDomain.UnhandledException), ma le eccezioni non gestite su InvokeAsync vengono silenziosamente ingerite. Continuare l'attività da InvokeAsync con qualcosa per intercettare le eccezioni sembra essere un lavoro valido. – Lamarth
'BeginInvoke' è modellato dopo il [" Modello di programmazione asincrono "] (https://msdn.microsoft.com/en-us/library/ms228963 (v = vs.110) .aspx) in .NET che utilizza' BeginSomething 'e' EndSomething' metodi per operazioni asincrone. Presumibilmente questo è il motivo per cui non è stato designato deprecato o obsoleto. Tranne che la convenzione 'Begin' /' End' è per l'uso di 'IAsyncResult', e' BeginInvoke' no, né esiste alcun 'EndInvoke', quindi era in qualche modo superfluo in primo luogo. – sidbushes