4

戻るのに時間がかかる Web サービスを呼び出すために使用することを検討してParallel.Forいますが、同時に何度も呼び出すことができ、1 回の呼び出しよりもそれほど長くはかからないことがわかっています。

そのために、私は Parallel.For を試しており、これがどのように機能するかについて自分のアイデアを確認したいと思っています。アプリケーションを台無しにしたくないので、私はおそらく少し慎重すぎると思います。また、このルートに進む場合、アプリケーション チーム全体が、並列コードにアクセスするときに何をする必要があるかを確実に認識できるようにしたいと考えています。

とにかく、これが私の現在の作業と理解です。

public IEnumerable<HotelAvail> GetAvailability (IList<string> codes, DateTime startDate, int numNights)
{
    HotelAvail[] result = new HotelAvail[codes.Count];

    Parallel.For(0, codes.Count, i =>
        {
            string code = codes[i];
            result[i] = new AvailService().
                GetAvailability(
                    code, startDate, numNights);
        });

    return result;
}

は、指定された日付範囲 ( + )AvailServiceの空室状況を取得します。プロパティの識別子です。startDatenumNightscode

最初に正しいサイズの結果配列を設定し、空のスロットをたくさん用意しました。

次に、並行してサービスを呼び出します。サービスが新しいHotelAvailオブジェクトを作成し、それを配列の正しい位置に配置します。

すべてが完了したら、配列を返します。この時点で完全に設定されているはずです。空白があってはなりません。このサービスは、システム状態の他の部分には影響しません。Web サービス呼び出しを作成して呼び出し、結果オブジェクトを返すだけです。

私が見ていないこれに関する問題はありますか?

上で述べたように、私は慎重すぎるかもしれませんが、若くて活気に満ちた時代にマルチスレッド コードを書くことに疲れていたので、同じ過ちを繰り返したくありません。

また、このコードは最終的に ASP.NET アプリケーションになります。マルチスレッドコードについて多くの不満があったことをぼんやりと思い出します。そこで発生する可能性のある追加の問題はありますか?

4

2 に答える 2

3

私には問題ないように見えますが、PLINQ はもう少しエレガントになると思います。

    public IEnumerable<HotelAvail> GetAvailability (IList<string> codes, 
                                                    DateTime startDate, 
                                                    int numNights)
    {
        return codes.AsParallel().AsOrdered().Select(code => 
                 new AvailService().GetAvailability(code, startDate, numNights))
                .ToList();
    }
于 2011-02-07T17:06:25.137 に答える
1

Asp.netの質問の場合、メソッド呼び出しがすぐに戻らないと、アプリケーションがタイムアウトする可能性があります。このシナリオで実行したいのは、コードごとにAJAXを使用してメソッドを呼び出し、HotelAvailWebサービスの呼び出しが完了したときにオブジェクトを返し、利用可能な場合は新しい情報でUIを更新することです。

于 2011-02-07T15:53:24.727 に答える