У меня много вопросов. С тех пор я видел .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
, но ничего интересного и простого в использовании. Может ли кто-нибудь дать мне немного света?