1

我无法完全想出创建通用方法来处理InvokeRequiredfor void 方法的解决方案(稍后我将处理返回值)。我在想类似的事情:

// Probably not the best name, any ideas? :)
public static void CheckInvoke(this Control instance,
                               ,Action<object, object> action)
{
  if (instance.InvokeRequired)
  {
    instance.Invoke(new MethodInvoker(() => action));
  }
  else
  {
    action()
  }
}

然后我可以写如下内容:

public partial class MyForm : Form
{
  private ThreadedClass c = new ThreadedClass();

  public MyForm()
  {
    c.ThreadedEvent += this.CheckInvoke(this
                                        ,this.MethodRequiresInvoke
                                        ,sender
                                        ,e);
  }
}

这显然不能编译,我只是不能将它完全结合在一起。

4

2 回答 2

2

Hans 是正确的,因为您可能不想将这样的代码包装起来,特别是因为它可能会在确定正在发生的线程操作时导致一些调试问题。也就是说,这将是您想要的签名:

public static class FormsExt
{
    public static void UnwiseInvoke(this Control instance, Action toDo)
    {
        if(instance.InvokeRequired)
        {
            instance.Invoke(toDo);
        }
        else
        {
            toDo();
        }
    }
}
于 2012-12-31T22:06:45.857 回答
1

“object,object”的松散动作参数(正如 JerKimball 建议的那样),将其命名为 SafeInvoke,并通过匿名委托附加到事件:

 c.ThreadedEvent += delegate
                        {
                           c.SafeInvoke(this.MethodRequiresInvoke);
                        };
于 2012-12-31T22:29:24.973 回答