Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用Func和Task#_C#_Delegates - Fatal编程技术网

C# 在C中使用Func和Task#

C# 在C中使用Func和Task#,c#,delegates,C#,Delegates,我在试图理解Func在C#中到底是如何工作的时候遇到了一些问题,尽管我读过一些关于它的好博客文章 我有以下情况: 我正在构建一个小型计费系统,它使用Azure服务总线队列来处理计费。用户可以初始化两个进程: 创建一个日记簿,用于检查交易是否正确 为客户创建实际发票 为此,我创建了一个通用方法来初始化一个计费任务(包含N个账单),该任务使用bool参数来判断它是需要创建的日记账还是实际账单。在该方法中,我正在运行以下检查: if (isDayBookProcessing) { // Day

我在试图理解
Func
在C#中到底是如何工作的时候遇到了一些问题,尽管我读过一些关于它的好博客文章

我有以下情况: 我正在构建一个小型计费系统,它使用Azure服务总线队列来处理计费。用户可以初始化两个进程:

  • 创建一个日记簿,用于检查交易是否正确
  • 为客户创建实际发票
  • 为此,我创建了一个通用方法来初始化一个计费任务(包含N个账单),该任务使用
    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
    方法在my
    ServiceBus
    类上运行
    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
    进行此操作纯粹是出于好奇,并试图学习一些新东西;-)