gpt4 book ai didi

wpf - 将使用 backgroundworker 的方法替换为 async/tpl (.NET 4.0)

转载 作者:行者123 更新时间:2023-12-03 22:21:17 24 4
gpt4 key购买 nike

我的问题很多。自从我看到。 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 的其他事情和 Dispatcher.Invoke ,但没有什么看起来有趣且易于使用。谁能给我一些光?

最佳答案

您应该只使用任务并行库 (TPL)。关键是指定 TaskScheduler对于当前 SynchronizationContext对于您更新 UI 的任何延续。例如:

Task.Factory.StartNew(() =>
{
return ProcessMethod(yourArgument);
})
.ContinueWith(antecedent =>
{
UpdateView(antecedent.Result);
},
TaskScheduler.FromCurrentSynchronizationContext());

除了访问前件的 Result 时的一些异常处理属性(property),仅此而已。通过使用 FromCurrentSynchronizationContext()来自 WPF 的环境 SynchronizationContext(即 DispatcherSynchronizationContext)将用于执行延续。这与调用 Dispatcher.[Begin]Invoke 相同。 ,但你完全从中抽象出来了。

如果您想变得更“干净”,如果您控制 ProcessMethod,我实际上会重写它以返回 Task并让它拥有它是如何旋转的(仍然可以在内部使用 StartNew)。这样,您就可以将调用者从 ProcessMethod 可能想要自己做出的异步执行决策中抽象出来,而他们只需要担心链接到一个延续来等待结果。

2013 年 5 月 22 日更新

应该注意的是,随着 .NET 4.5 的出现和 C# 中的异步语言支持,这种规定的技术已经过时了,您可以简单地依靠这些特性来使用 await Task.Run 执行特定任务。然后执行之后将再次自动在 Dispatcher 线程上进行。所以是这样的:
MyResultType processingResult = await Task.Run(() =>
{
return ProcessMethod(yourArgument);
});

UpdateView(processingResult);

关于wpf - 将使用 backgroundworker 的方法替换为 async/tpl (.NET 4.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12292527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com