Mis preguntas son muchas. Desde que lo vi. NET 4.5, quedé muy impresionado. Lamentablemente, todos mis proyectos son .NET 4.0 y no estoy pensando en migrar. Entonces me gustaría simplificar mi código.Reemplazar los métodos que utilizan backgroundworker por async/.tpl (.NET 4.0)
En la actualidad, la mayor parte del código que suelen tener tiempo suficiente para congelar la pantalla, hago lo siguiente:
BackgroundWorker bd = new BackgroundWorker();
bd.DoWork += (a, r) =>
{
r.Result = ProcessMethod(r.Argument);
};
bd.RunWorkerCompleted += (a, r) =>
{
UpdateView(r.Result);
};
bd.RunWorkerAsync(args);
Honestamente, estoy cansado de él. Y eso se convierte en un gran problema cuando hay una interacción compleja lógica del usuario.
Me pregunto, ¿cómo simplificar esta lógica? (Recuerde que estoy con. Net 4.0) Noté algunas cosas en google, pero no encontré nada fácil de implementar y adecuado para mis necesidades.
pensé por debajo de esta solución:
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;
}
}
No estoy seguro sobre el impacto es en la manipulación de la estructura despachador. Pero sé que funcionaría muy bien, por ejemplo, podría usarlo en todos los eventos de controles sin molestarme en congelar la pantalla. Mi conocimiento sobre los tipos genéricos, la covarianza y la contravarianza es limitado, tal vez este código se puede mejorar.
Pensé en otras cosas usando Task.Factory.StartNew
y Dispatcher.Invoke
, pero nada que parezca interesante y fácil de usar. ¿Alguien puede darme algo de luz?
parece una buena opción para simplificar mi código, ya puedo imaginar cómo usarlo. Aunque, no habrá una solución q pueda continuar en la misma ejecución del método? –
@ J.Lennon No sé lo suficiente sobre su implementación actual de cola de trabajo, pero ciertamente puede hacer que este concepto funcione con lo que sea. Si tiene control sobre la implementación, le recomendaría utilizar TPL DataFlow API (ActionBlock) como mecanismo de puesta en cola. Sin embargo, eso es todo un post separado para entender todo eso. :) –