У меня возникают некоторые проблемы, пытаясь понять, как именно Func
работает на C#, несмотря на то, что прочитал несколько хороших блог-постов об этом.Использование Func с задачей в C#
У меня есть следующий сценарий: Я строю небольшую биллинговую систему, которая использует очередь Azure Service Bus для обработки счетов. Там это два процесса, которые могут быть инициализированы пользователем:
- Создайте Daybook для проверки того, что операции правильно перед
- создания фактического счета-фактуры для клиента
Для этого, я имею сделал общий метод, который инициализирует задачу биллинга (содержащую N биллинга), которая принимает параметр bool
, чтобы указать, является ли это дневной или фактический счет, который необходимо создать. В этом методе, я бегу следующую проверку:
if (isDayBookProcessing)
{
// Daybook processing code here
}
else
{
// Run queue process async
StartQueueProcess(queueName, billingTaskId, numOfItemsEnqueued);
}
Я тогда получил общий метод «StartQueueProcess», который запускается в своем собственном Task
так:
private void StartQueueProcess(string queueName, int billingTaskId, int numOfItemsEnqueued)
{
Task.Factory.StartNew(() => _factory.AzureFactory.ServiceBus.ProcessBillingQueue(queueName, billingTaskId, numOfItemsEnqueued));
}
Как вам можно видеть, метод StartQueueProcess
запускает метод ProcessBillingQueue
на моем ServiceBus
классе, а это значит, что он не может запустить ProcessDaybookQueue
то, что я изначально думал, было просто использовать Func<string, int, int, bool>
в d сделать StartQueueProcess
метод возвращает логическое значение (так как Func
нужно вернуть что-то), что делает его выглядеть следующим образом:
if (isDayBookProcessing)
{
// Daybook processing code here
StartQueueProcess(_factory.AzureFactory.ServiceBus.ProcessDaybookQueue(queueName, billingTaskId, numOfItemsEnqueued));
}
else
{
// Run queue process async
StartQueueProcess(_factory.AzureFactory.ServiceBus.ProcessBillingQueue(queueName, billingTaskId, numOfItemsEnqueued));
}
private bool StartQueueProcess(Func<string, int, int, bool> processMethod)
{
Task.Factory.StartNew(() => processMethod);
return true;
}
Однако это дает ошибку, говоря мне, что Argument type 'void' is not assignable to parameter type 'System.Func<string, int, int bool>'
Мои _factory.AzureFactory.ServiceBus.ProcessDaybookQueue(queueName, billingTaskId, numOfItemsEnqueued)
возвращает ничтожным. Возврат Func<string, int, int, bool>
не вызывает ошибок. Но почему именно? Разве я не могу заставить его вернуть то, что хочу (т. Е. Пусто)?
Может ли кто-нибудь пролить свет на это? :-)
большую статью на эту тему: http://goo.gl/gWgzPP –
Спасибо большое! :-) –