现在的位置: 首页 > 综合 > 正文

避免InvokeRequired(2)

2011年07月01日 ⁄ 综合 ⁄ 共 1397字 ⁄ 字号 评论关闭

上篇

原文:http://www.codeproject.com/KB/cs/AvoidingInvokeRequired.aspx

(转载请注明原文出处!)
http://www.whitejadesoft.com/CharlesJia/

“匿名委托”模式

由于在C# 2.0 中我们有匿名委托和MethodInvoke类,所以可以简化标准模式为:

private void SetTextAnonymousDelegatePattern()
{
    if (this.InvokeRequired)
    {
        MethodInvoker del = delegate { SetTextAnonymousDelegatePattern(); };
        this.Invoke(del);
        return;
    }
    this.text = "New Text";
}

这是一个略微好一点的办法,但是我从没见过有人去用它。

但是如果不是执行 this.text = "New Text",而是需要调用一个带参数的方法呢,将会是怎么样的情况呢?就像这样:

private void MultiParams(string text, int number, DateTime dateTime);

这也不是什么麻烦,因为委托(delegate)能够访问外部变量,所以你能这样改写:

private void SetTextDelegatePatternParams(string text, int number, DateTime datetime)

{

    if (this.InvokeRequired)

    {

        MethodInvoker del = delegate {

SetTextDelegatePatternParams(text, number, datetime); };

        this.Invoke(del);

        return;

    }

    MultiParams(text, number, datetime);

}

“匿名委托”模式能够减少很多麻烦,如果你“忘记”去检查invoke是否是必须的。
这将我们引向——
“最小匿名委托”模式
这实在是太好不过了:
//No parameters
private void SetTextAnonymousDelegateMiniPattern()
{
    Invoke(new MethodInvoker(delegate
    {
    	this.text = "New Text";
    }));
}
//With parameters
private void SetTextAnonymousDelegateMiniPatternParams
		(string text, int number, DateTime dateTime)
{
    Invoke(new MethodInvoker(delegate
    {
    	MultiParams(text, number, dateTime);
    }));
}
这确实行之有效,并且易于书写,距离完美就只剩几行代码了。当我第一次看到时,
我以为这就是我一直找寻的。但是有什么问题呢?:) 我们忘记了去检测Invoke是
否是必须的。并且因为这不是一个“标准”的解决办法,这对于其他人来说
(或者在数个月之后对于我们自己),为什么我们要这样做,这还显得不够清晰。我
们当然能够很nice的对待这些代码,并且加一些注释,但是老实说吧,我们不会这样去做。
至少我希望我的代码能够更清楚的“展现意图”,所以,我们有——

抱歉!评论已关闭.