2

現在、Silverlight 内に、以下のコードのような呼び出しを行う多くの Web サービス呼び出しを統合する必要があります。3 つすべての読み込みが完了するまで、ユーザーの操作はできません。

// In my view, having standard delegate methods (non-anonymous) makes the 
// code below even messier.

// I've left out the EventArgs to shorten the example however
// I usually use these objects in the delegate method.
MyService1 service1 = new MyService1();
service1.GetAllUsersCompleted += delegate
{
    MyService2 service2 = new MyService2();
    service2.AnotherTaskCompleted += delegate
    {
        MyService3 service3 = new MyService3();
        service3.YetAnotherTaskCompleted += delegate
        {
            // etc.
        };
        service3.YetAnotherTask();
    };
    service2.AnotherTask();
};
service1.GetAllUsers();

基本的に呼び出しを同期させたいのですが、Silverlight の Web サービス プロキシ クラスのアーキテクチャ (すべてがイベント ドリブン) のため、これを行うことはできません。

私の質問は、1 つのデリゲート メソッドから別のメソッドを呼び出して別のメソッドを呼び出し、管理しやすいものにリファクタリングするための、より洗練されたソリューション、または .NET 中心のデザイン パターンがあるのでしょうか?

コードに関する私の最大の問題の 1 つは、実際のメソッド呼び出しがデリゲートでの大部分の作業の後に来ることです。

4

3 に答える 3

2

まず、可能であれば、3つの呼び出しすべてを同時に実行して、Silverlightの非同期の性質を利用することをお勧めします。

これは、タスク(特にタスクの継続)を使用して「順次」実行できますが、この種の状況を適切に処理するように設計されたRxライブラリーも確認することをお勧めします。

もう1つの最後のヒント:ユーザーの操作を禁止することはお勧めしません。少なくとも、操作をキャンセルするオプションを提供します。

于 2010-07-19T11:19:51.727 に答える
1

これは、(Parallel ライブラリの) 新しい Tasks クラスが抽象化しようとしているものだと思いますが、間違っている可能性があります :)

于 2010-07-19T10:48:28.340 に答える
0

ここで間違っているかもしれませんが、デリゲートは既に同期していません。BeginInvoke メソッドを使用して非同期にすることができます。これは、同期および非同期メソッド呼び出しの優れたリソースであり、いくつかのパターンなどについて説明しています。http://support.microsoft.com/kb/315582

記事のタイトルは「Visual C# メソッドを非同期的に呼び出す方法」かもしれませんが、途中で同期メソッド呼び出しの例があります。

于 2010-07-19T10:57:55.967 に答える