首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#菜鸟textbox.Invoke(resetMsgTxtCallBack, new object[] { textbox })

2013-09-29 
C#初学者求助textbox.Invoke(resetMsgTxtCallBack, new object[] { textbox })以下代码是:使用委托,根据控

C#初学者求助textbox.Invoke(resetMsgTxtCallBack, new object[] { textbox })
以下代码是:使用委托,根据控件的InvokeRequired属性判断当前控件的更新操作是否是在另一个线程中。如果是,则使用委托进行方法调用并更新控件。
 delegate void ResetMsgTxtCallBack(TextBox textbox);
        private void ResetMsgTxt(TextBox textbox)
        {
            if (textbox.InvokeRequired)
            {
                ResetMsgTxtCallBack resetMsgTxtCallBack = ResetMsgTxt;
                textbox.Invoke(resetMsgTxtCallBack, new object[] { textbox });
            }
            else
            {
                textbox.Clear();
                textbox.Focus();
            }
        }
----------------------
1.textbox.Invoke方法里为什么用new object[] { textbox }作参数?
2.为什么这样回调后就会跳转到else里面呢?
总体来说 :就是这一句textbox.Invoke(resetMsgTxtCallBack, new object[] { textbox });后面为什么用new object[] { textbox }做参数我不懂

求前辈们指点

c# 线程 delegate
[解决办法]
Invoke调用委托需要传参数。传几个参数,传什么类型的参数都不知道。

如果你是Invoke这个函数的设计者,你觉得怎么设计最简单。当然是用object[]表示参数啦。
[解决办法]
当参数类型和个数都不确定的情况下,用object数组可以解决这个问题。
[解决办法]
不会回到当前这个程序的else中来,而是会重新调用一次ResetMsgTxt

ResetMsgTxtCallBack resetMsgTxtCallBack = ResetMsgTxt;
textbox.Invoke(resetMsgTxtCallBack, new object[] { textbox });

原因是你传入了ResetMsgTxt这个方法。

而重新调用的那次是在UI线程中运行,此时textbox.InvokeRequired为false,所以走入else分支。

你的代码等价:

private void ResetMsgTxt(TextBox textbox)
        {
            if (textbox.InvokeRequired)
            {
                ResetMsgTxtCallBack resetMsgTxtCallBack = ResetMsgTxt1;
                textbox.Invoke(resetMsgTxtCallBack, new object[] { textbox });
            }
        }
private void ResetMsgText1(TextBox textbox)
{
                textbox.Clear();
                textbox.Focus();
}

你把两个函数写成一个了而已。

热点排行