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