2

サービスレイヤーとは異なる設定で制御したい非同期ダウンローダークラスがあります。

ダウンローダークラスでは、ダウンロードの処理方法を制御するために次の設定を行いました。モニターなどはInvokerに焦点を合わせ続けてください:)

public Func<CompletionParams, bool> CompletionQuery { get; set; }

        public class CompletionParams
        {
            public int ItemsToDownload { get; set; }
            public long TimeoutInMilliseconds { get; set; }
        }

//他のものがここにあります

 while (!this.CompletionQuery.Invoke(new CompletionParams { ItemsToDownload = items.Count(), TimeoutInMilliseconds = sw.ElapsedMilliseconds }))
                lock (this.waitForMe)
                    Monitor.Wait(waitForMe, 250);

次に、サービスレイヤーでダウンローダーを次のように構成します。

downloaderFoo.CompletionQuery = limit => 
                limit.ItemsToDownload >= 22 || limit.TimeoutInMilliseconds > 2000;

しかし、これについて私が気に入らないのは、whileループが.Invokeを使用していることです。

フローを制御するために用途の広いラムダ式を使用するより良い方法はありますか?

4

1 に答える 1

2

whileカスタム完了クエリデリゲートを指定する汎用性を失うことなく、ラムダを失う方法はありません。デリゲートを使用してコードを保存し、デリゲートを呼び出すには呼び出しを行う必要があります。

一方、コードの一部が気に入らない場合は、.Invoke削除してください。

while (!this.CompletionQuery(new CompletionParams { ItemsToDownload = items.Count(), TimeoutInMilliseconds = sw.ElapsedMilliseconds }))

しかし、コメントで指摘されているように、これはまだ下で呼び出しを行います。

于 2011-03-07T22:41:57.257 に答える