我的问题很多。自从我看到。NET 4.5,我印象非常深刻。不幸的是,我所有的项目都是 .NET 4.0,我没有考虑迁移。所以我想简化我的代码。
目前,我的大部分代码通常需要足够的时间来冻结屏幕,我执行以下操作:
BackgroundWorker bd = new BackgroundWorker();
bd.DoWork += (a, r) =>
{
r.Result = ProcessMethod(r.Argument);
};
bd.RunWorkerCompleted += (a, r) =>
{
UpdateView(r.Result);
};
bd.RunWorkerAsync(args);
老实说,我厌倦了它。当存在逻辑复杂的用户交互时,这将成为一个大问题。
我想知道,如何简化这个逻辑?(请记住,我使用的是 .Net 4.0)我注意到 google 的一些东西,但没有发现任何易于实现且适合我需要的东西。
我认为这个解决方案如下:
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;
}
}
我不确定对操作调度程序框架的影响。但我知道它会很好用,例如,我可以在控件的所有事件中使用它,而无需费心冻结屏幕。我对泛型、协变、逆变的知识有限,也许这段代码可以改进。
我想到了使用Task.Factory.StartNew
and的其他东西Dispatcher.Invoke
,但没有任何东西看起来有趣且易于使用。谁能给我一些光?