C#初学者求助textbox.Invoke(resetMsgTxtCallBack, new object[] { textbox })

游荡孔明 2013-09-28 09:30:19
以下代码是:使用委托,根据控件的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 }做参数我不懂

求前辈们指点

...全文
356 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
游荡孔明 2013-09-28
  • 打赏
  • 举报
回复
引用 4 楼 caozhy 的回复:
不会回到当前这个程序的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(); } 你把两个函数写成一个了而已。
哦,明白了,谢谢!
threenewbee 2013-09-28
  • 打赏
  • 举报
回复
不会回到当前这个程序的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(); } 你把两个函数写成一个了而已。
游荡孔明 2013-09-28
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
Invoke调用委托需要传参数。传几个参数,传什么类型的参数都不知道。 如果你是Invoke这个函数的设计者,你觉得怎么设计最简单。当然是用object[]表示参数啦。
引用 2 楼 guwei4037 的回复:
当参数类型和个数都不确定的情况下,用object数组可以解决这个问题。
那为什么这样回调后就会跳转到else里面呢?
全栈极简 2013-09-28
  • 打赏
  • 举报
回复
当参数类型和个数都不确定的情况下,用object数组可以解决这个问题。
threenewbee 2013-09-28
  • 打赏
  • 举报
回复
Invoke调用委托需要传参数。传几个参数,传什么类型的参数都不知道。 如果你是Invoke这个函数的设计者,你觉得怎么设计最简单。当然是用object[]表示参数啦。

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧