如何获取从Invoke方法调用的函数的返回值

时间:2011-11-03 18:29:42

标签: c# .net winforms multithreading invoke

我需要解释..为什么下面的代码会给出:Parameter count mismatch

C#代码:

//... 
public delegate int FindInRichTextBoxMethod(RichTextBox rtx, string target, int index);
 public int FindInRichTextBox(RichTextBox rtx, string target, int index)
    {
        return rtx.Find(target, index, RichTextBoxFinds.None);
    }
// ... 
int start; 
string tempState = "foo";

if (lista.InvokeRequired) {
  object find = Invoke((FindInRichTextBoxMethod)delegate
                            {
                                return FindInRichTextBox(list, tempState, len);
                            });  

                            start = (int)find;
} else {

      start = FindInRichTextBox(list, tempState, len);
 }

提前致谢。

2 个答案:

答案 0 :(得分:2)

Invoke()的参数包括一个委托,以及传递给该委托的参数。您尝试传递FindInRichTextBoxMethod委托,但该委托类型需要三个参数。你需要:

  1. 使用您的FindInRichTextBox方法构建委托,然后
  2. 将参数传递给该委托。
  3. 这样的事情:

    var finder = new FindInRichTextBoxMethod(FindInRichTextBox);
    object find = Invoke(finder, new object[] { list, tempState, len }); 
    

    另一种方法是传递一个关闭,有点像你在你的样本中尝试。在您的情况下,错误是由于转换为FindInRichTextBoxMethod,因此Invoke期待参数。相反,您可以忽略强制转换并传入一个匿名委托,如下所示:

    var find = Invoke(delegate { return FindInRichTextBox(list, tempState, len); });
    
    但是,这不会起作用,因为编译器无法准确确定您要对匿名委托做什么。同样,lambda也不能自动转换:

    var find = Invoke(() => FindInRichTextBox(list, tempState, len));
    

    要了解解决问题的原因和方法,请阅读Why must a lambda expression be cast when supplied as a plain Delegate parameter

答案 1 :(得分:0)

您是否在Invoke来电中收到此消息?我通常传递Invoke一个委托,然后传递一个包含你想传递的变量的对象数组。