窗口线程调用非void函数时Lambda写法抛参数异常,求排查错误
问题分析:Invoke调用带返回值方法时的Lambda错误
原无返回值调用代码
Invoke((MethodInvoker)(() => SendCommand(_monitorCmd, _monitorOutput)));
出错的带返回值调用尝试
要调用返回值为string的string SendCommand(string cmd, CommandOutput outputTo)并获取返回值,以下代码编译通过但运行时抛出TargetParameterCountException:
string rx = Invoke(new Func<string, CommandOutput, string>( (c, m)=> SendCommand(cmd, _monitorOutput) ));
错误原因
- 委托参数与Invoke调用不匹配:你创建的
Func<string, CommandOutput, string>需要接收两个输入参数,但调用Control.Invoke时没有传入这两个参数,导致运行时无法找到足够的参数匹配委托要求,触发参数数量异常。 - Lambda参数冗余且未使用:你的Lambda表达式定义了
c和m两个参数,但实际代码里直接捕获了外部变量cmd和_monitorOutput,完全没用到这两个参数,属于不必要的冗余定义,同时也误导了委托类型的选择。
正确写法示例
方式1:传递委托所需参数给Invoke
直接使用方法名作为委托实例,并在Invoke后附加参数:
string rx = (string)Invoke(new Func<string, CommandOutput, string>(SendCommand), cmd, _monitorOutput);
方式2:使用无参数Func简化
既然已经捕获了外部变量,直接用无参数的Func<string>更简洁:
string rx = (string)Invoke(new Func<string>(() => SendCommand(cmd, _monitorOutput)));
对比你的解决方法
你后来通过委托变量直接调用del.Invoke(cmd, _monitorOutput)能成功,是因为你明确给委托传递了它所需的两个参数,而之前的Control.Invoke调用恰好缺失了这一步。
内容的提问来源于stack exchange,提问作者jackhab
相关产品推荐
相关产品推荐

