Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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# 表达式应为MethodCallExpression调用表达式时出错<;行动>;_C#_Async Await - Fatal编程技术网

C# 表达式应为MethodCallExpression调用表达式时出错<;行动>;

C# 表达式应为MethodCallExpression调用表达式时出错<;行动>;,c#,async-await,C#,Async Await,下面的代码抛出此异常的原因是什么,它说“表达式必须是MethodCallExpression。我认为调用操作是 Action startBouncePolling = new Action(async () => { }); BackgroundJob.Enqueue(() => startBouncePolling()); Enqueue的签名是表达式的一个参数当您调用startBouncePolling()时,您不是在调用一个方法。star

下面的代码抛出此异常的原因是什么,它说“表达式必须是MethodCallExpression。我认为调用操作是

     Action startBouncePolling = new Action(async () =>
    {

    });

    BackgroundJob.Enqueue(() => startBouncePolling());

Enqueue的签名是
表达式的一个参数

当您调用
startBouncePolling()
时,您不是在调用一个方法。
startBouncePolling
不是一个方法,而是一个委托。因此,您实际上是在调用委托

因此,lambda表达式的主体
()=>startBouncePolling()
最终成为
调用表达式
,而不是
方法调用表达式

如果使用方法而不是委托,例如:

public async Task StartBouncePolling()
{
}
...
BackgroundJob.Enqueue(() => StartBouncePolling());

那么主体将是一个
MethodCallExpression

当您调用
startBouncePolling()
时,您不是在调用一个方法。
startBouncePolling
不是一个方法,而是一个委托。因此,您实际上是在调用委托

因此,lambda表达式的主体
()=>startBouncePolling()
最终成为
调用表达式
,而不是
方法调用表达式

如果使用方法而不是委托,例如:

public async Task StartBouncePolling()
{
}
...
BackgroundJob.Enqueue(() => StartBouncePolling());

那么主体将是一个
MethodCallExpression

抱歉,我想问的是如果可能的话如何强制执行此操作,因为还有一些其他限制阻止我将其创建为一个方法。我不知道原因是否重要,但需要明确的是:Enqueue返回一个作业id,我需要在StartBounce中使用该作业id轮询()以从内部取消作业。但是,如果我不使用
ref
修饰符传递作业ID,我相信它不会从Enqueue()的返回值更新因为字符串引用将作为值传递。异步方法不能有ref修饰符。我的方法必须是异步的。好吧,你需要一个方法才能有MethodCallExpression。我不知道它是否能满足你的用例,但你可以做
startBouncePolling.Invoke()
而不是
startBouncePolling()
。然后它应该是对委托类型的方法调用。但这可能会以其他方式爆发..在不创建单独的方法的情况下,我可以声明
字符串jobid
内联,并在操作中使用它,而不必作为引用传递。抱歉,我想问的是,如果可能的话,如何强制执行此操作,因为还有一些其他限制阻止我不知道原因是否重要,但需要澄清的是:Enqueue返回一个作业id,我需要在StartBouncePolling()中使用该作业id,以便从内部取消作业。但是,如果我不使用
ref
修饰符传递作业id,我相信它不会从Enqueue()的返回值更新因为字符串引用将作为值传递。异步方法不能有ref修饰符。我的方法必须是异步的。好吧,你需要一个方法才能有MethodCallExpression。我不知道它是否能满足你的用例,但你可以做
startBouncePolling.Invoke()
而不是
startBouncePolling()
。然后它应该是对委托类型的方法调用。但这可能会以其他方式爆发。在不创建单独的方法的情况下,我可以声明
字符串jobid
内联,并在操作中使用它,而不必作为ref传递。