我的問題很多。自從我看到了。 NET 4.5,我印象非常深刻。不幸的是,我所有的項目都是.NET 4.0,我不考慮遷移。所以我想簡化我的代碼。替換使用backgroundworker到async/tpl的方法(.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)我注意到了谷歌的一些事情,但沒有發現任何易於實現和適合我需求的東西。
我想下面這個方案:
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
,但沒有看起來有趣和簡單的使用。任何人都可以給我點亮嗎?
似乎是一個很好的選擇來簡化我的代碼,我已經可以想象如何使用它。儘管如此,我不能繼續使用相同的方法執行嗎? –
@ J.Lennon我對當前的工作隊列實現還不夠了解,但是您無論如何都可以使這個相同的概念工作。如果您對實現有控制權,我會建議使用TPL DataFlow API(ActionBlock)作爲排隊機制。儘管如此,這是一個完整的獨立文章。 :) –