私の質問はたくさんあります。私が見たので。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を使用していることを忘れないでください)グーグルでいくつかのことに気づきましたが、実装が簡単で私のニーズに適したものは見つかりませんでした。
私はこの解決策を以下で考えました:
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
、面白くて使いやすいとは思えません。誰かが私にいくつかの光を与えることができますか?