c# – 带有out参数的control.invoke

Winforms,C#,VS2010.

我有一个轮询线程,运行我的应用程序的生命周期.

偶尔它会在我的主表单上调用一个事件.多年来我没有触及代码并且运行成功,但现在我需要在参数列表中添加“out”参数.我在网上搜索过,但我发现的所有主题都是关于反射的,并且试图转换为我的上下文很复杂.我不使用反射.

有人可以帮忙解决这个问题吗?在我读过的反射线程中,人们似乎检查了一些对象数组的out参数结果,我在代码中没有使用它,而且我不知道在哪里得到它.

private bool OnNeedUpdateCreateEvent(string title, string message,
  bool creatingNew, out string newPlanName)
{
    newPlanName = "";

    // 1st pass through this function. 
    // Check to see if this is being called from another thread rather 
    // than the main thread. If so then invoke is required
    if (InvokeRequired)
    {
      // Invoke and recall this method.
      return (bool)Invoke(new onNeedToUpdatePlanEvent(OnNeedUpdateCreateEvent),
        title, message, creatingNew, out newPlanName); <- wrong out param

    }
    else
    {
      // 2nd pass through this function due to invoke, or invoke not required
      return InputDlg(this, title, message, creatingNew, out newPlanName);
    }

} 

解决方法:

这很像你已经知道的,你还没有找到阵列.它由编译器自动创建. Invoke method的签名是:

public object Invoke(
    Delegate method,
    params object[] args
)

params关键字使编译器自动创建数组.很好的语法糖,但它对你没有帮助.你必须自己做,像这样:

if (!creatingNew) {
    // Invoke and recall this method.
    object[] args = new object[] { title, message, creatingNew, null };
    var retval = (bool)Invoke(new onNeedToUpdatePlanEvent(OnNeedUpdateCreateEvent), args);
    newPlanName = (string)args[3];
    return retval;
}
// etc..
上一篇:进行无闪烁动画C#自定义控件的最佳方法是什么?


下一篇:c#如何使用图形路径制作平滑的弧形区域