Func Invoke, есть ли лучшее решение - PullRequest
2 голосов
/ 08 марта 2011

У меня есть класс асинхронного загрузчика, которым я хочу управлять с другими настройками из сервисного уровня.

В классе загрузчика у меня есть следующие настройки для управления загрузкой. Не обращайте внимания на монитор и т. Д. Сосредоточьтесь на 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

Есть ли лучший способ использовать универсальное лямбда-выражение для управления потоком?

1 Ответ

2 голосов
/ 08 марта 2011

Невозможно потерять лямбду в while без потери универсальности указания пользовательского делегата запроса завершения. Вы используете делегата для хранения кода, для вызова делегата необходимо выполнить Invoke.

Если, с другой стороны, вам просто не нравится часть кода .Invoke, просто удалите ее:

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

Но, как было отмечено в комментариях, это все равно будет вызывать Invoke.

...