C# 在C中使用Func和Task#
我在试图理解C# 在C中使用Func和Task#,c#,delegates,C#,Delegates,我在试图理解Func在C#中到底是如何工作的时候遇到了一些问题,尽管我读过一些关于它的好博客文章 我有以下情况: 我正在构建一个小型计费系统,它使用Azure服务总线队列来处理计费。用户可以初始化两个进程: 创建一个日记簿,用于检查交易是否正确 为客户创建实际发票 为此,我创建了一个通用方法来初始化一个计费任务(包含N个账单),该任务使用bool参数来判断它是需要创建的日记账还是实际账单。在该方法中,我正在运行以下检查: if (isDayBookProcessing) { // Day
Func
在C#中到底是如何工作的时候遇到了一些问题,尽管我读过一些关于它的好博客文章
我有以下情况:
我正在构建一个小型计费系统,它使用Azure服务总线队列来处理计费。用户可以初始化两个进程:
bool
参数来判断它是需要创建的日记账还是实际账单。在该方法中,我正在运行以下检查:
if (isDayBookProcessing)
{
// Daybook processing code here
}
else
{
// Run queue process async
StartQueueProcess(queueName, billingTaskId, numOfItemsEnqueued);
}
然后我得到了一个通用的“StartQueProcess”方法,它在自己的任务中运行,如下所示:
private void StartQueueProcess(string queueName, int billingTaskId, int numOfItemsEnqueued)
{
Task.Factory.StartNew(() => _factory.AzureFactory.ServiceBus.ProcessBillingQueue(queueName, billingTaskId, numOfItemsEnqueued));
}
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;
}
private bool StartQueueProcess(
string param1,
int param2,
int param3,
Action<string, int, int> processMethod)
{
Task.Factory.StartNew(() => processMethod(param1, param2, param3));
}
如您所见,startqueprocess
方法在myServiceBus
类上运行ProcessBillingQueue
方法,这意味着它不能运行ProcessDaybookQueue
我最初的想法是使用Func
并使startqueprocess
方法返回bool(因为Func
需要返回一些内容),使其看起来像这样:
private void StartQueueProcess(string queueName, int billingTaskId, int numOfItemsEnqueued)
{
Task.Factory.StartNew(() => _factory.AzureFactory.ServiceBus.ProcessBillingQueue(queueName, billingTaskId, numOfItemsEnqueued));
}
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;
}
private bool StartQueueProcess(
string param1,
int param2,
int param3,
Action<string, int, int> processMethod)
{
Task.Factory.StartNew(() => processMethod(param1, param2, param3));
}
if(isDayBookProcessing)
{
//这里是Daybook处理代码
startqueeprocess(_factory.AzureFactory.ServiceBus.ProcessDaybookQueue(queueName,BillingTaskKid,numOfItemsEnqueued));
}
其他的
{
//异步运行队列进程
startqueeprocess(_factory.AzureFactory.ServiceBus.ProcessBillingQueue(queueName,BillingTaskKid,numOfItemsEnqueued));
}
私有bool startqueprocess(Func processMethod)
{
Task.Factory.StartNew(()=>processMethod);
返回true;
}
但是,这会给出一个错误,告诉我参数类型“void”不能分配给参数类型“System.Func”
My\u factory.AzureFactory.ServiceBus.ProcessDaybookQueue(queueName、BillingTaskKid、numOfItemsEnqueued)
返回void。使其返回Func
不会出现错误。但究竟为什么呢?难道我不应该让它返回我想要的东西吗(即无效)
有人能解释一下吗?:-) 您不需要
函数
,您需要操作
。Func
是指代理具有返回值时。当没有返回值时,适合执行操作
:
private void StartQueueProcess(Action<string, int, int> processMethod)
{
Task.Factory.StartNew(() => processMethod);
}
虽然我看到您正在调用相同的方法,因此我认为没有必要使用if-else
我看到两个不同的问题:
1.我担心Task.Factory.StartNew(()=>processMethod)
不会做您期望它做的事情。它不会执行processMethod
。
2. startqueprocess
定义为接受具有三个参数的Func函数。它没有提到参数本身。你有责任为这个lambda提供一些参数
为什么您假设需要在此处使用Func
?你不必这么做。您的startqueeprocess
可以如下所示:
private void StartQueueProcess(string queueName, int billingTaskId, int numOfItemsEnqueued)
{
Task.Factory.StartNew(() => _factory.AzureFactory.ServiceBus.ProcessBillingQueue(queueName, billingTaskId, numOfItemsEnqueued));
}
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;
}
private bool StartQueueProcess(
string param1,
int param2,
int param3,
Action<string, int, int> processMethod)
{
Task.Factory.StartNew(() => processMethod(param1, param2, param3));
}
关于这个主题的好文章:谢谢你的回答Yuval,这肯定比我的方法更简单:-)我确实需要
if else
,因为ServiceBus方法中有不同的逻辑。嗨,Alexey,谢谢你的回答!-)谢谢!我想我遗漏的是参数,我认为参数是通过在调用方法中包含它们而自动(不知何故)传递的(请参阅我的原始post代码)。我使用了尤瓦尔编写的代码,它完成了它应该完成的工作。使用Func
进行此操作纯粹是出于好奇,并试图学习一些新东西;-)