mie domande sono molte. Da quando ho visto. NET 4,5, sono rimasto molto colpito. Sfortunatamente tutti i miei progetti sono .NET 4.0 e non sto pensando di migrare. Quindi vorrei semplificare il mio codice.metodi che utilizzano Sostituzione BackgroundWorker a asincrona/tpl (NET 4.0)
Attualmente, la maggior parte del mio codice che richiede solitamente abbastanza tempo per bloccare l'immagine, faccio la seguente:
BackgroundWorker bd = new BackgroundWorker();
bd.DoWork += (a, r) =>
{
r.Result = ProcessMethod(r.Argument);
};
bd.RunWorkerCompleted += (a, r) =>
{
UpdateView(r.Result);
};
bd.RunWorkerAsync(args);
Onestamente, io sono stanco di esso. E questo diventa un grosso problema quando c'è un'interazione utente logica complessa.
mi chiedo, come semplificare questa logica? (Ricorda che sono con. Net 4.0) Ho notato alcune cose da google, ma non ho trovato nulla di facile da implementare e adatto alle mie esigenze.
ho pensato che questa soluzione qui di seguito:
var foo = args as Foo;
var result = AsyncHelper.CustomInvoke<Foo>(ProcessMethod, foo);
UpdateView(result);
public static class AsyncHelper
{
public static T CustomInvoke<T>(Func<T, T> func, T param) where T : class
{
T result = null;
DispatcherFrame frame = new DispatcherFrame();
Task.Factory.StartNew(() =>
{
result = func(param);
frame.Continue = false;
});
Dispatcher.PushFrame(frame);
return result;
}
}
io non sono sicuro circa l'impatto è sulla manipolazione del telaio dispatcher. Ma so che funzionerebbe molto bene, ad esempio, potrei usarlo in tutti gli eventi dei controlli senza preoccuparmi di congelare lo schermo. Le mie conoscenze su tipi generici, covarianza, controvarianza sono limitate, forse questo codice può essere migliorato.
Ho pensato ad altre cose usando Task.Factory.StartNew
e Dispatcher.Invoke
, ma nulla che sembra interessante e semplice da usare. Qualcuno può darmi un po 'di luce?
sembra una buona opzione per semplificare il mio codice, posso già immaginare come usarlo. Sebbene, non ci sarà una soluzione che non posso continuare con la stessa esecuzione del metodo? –
@ J.Lennon Non ne so abbastanza della tua attuale implementazione della coda di lavoro, ma puoi certamente far funzionare questo stesso concetto con qualunque esso sia. Se hai il controllo sull'implementazione, ti consiglio di utilizzare le API di TPL DataFlow (ActionBlock) come meccanismo di accodamento. Questo è un post completamente separato per capire tutto questo però. :) –