最近在写一个基于UDP协议的SmartPhone/PC结构的C/S软件,其中有一个功能将SmartPhone中的联系人读到PC端并在TreeView中显示。
我采用的UDP模型就是我的另一篇文章《 .NET Compact Framework 1.x 下进行UDP通信 》 中描述的模型,就是在线程中进行监听,用事件抛出通信结果数据。那么,当我在UDP Server的事件中接受到联系人列表的时候,我实在在UDP Server 的OnReceiveBuffer事件中直接对TreeView进行操作时,问题就来了,我不能正确操作(不能添加任何Node)。
起初,我以为是我操作TreeView的时候出错,所以把精力都放到TreeView的操作上,经过反复测试发现TreeView操作没有任何问题,并且在Form的Onload事件里,进行如下操作的时候,正确无误:
TreeNode _treeNode;
_treeNode = this.m_treeView.Nodes.Add("Test");
但是在OnReceiveBuffer事件中进行以上操作的时候则不能正确添加Test Node,多次测试未果。我终于想到是线程问题,记得写Delphi程序的时候,线程中操作可视化组件需要同步处理,我想在.net中也是如此吧。找到问题的症结,就有针对性了,在MSDN上找到了处理办法,只要进行如下处理就可解决这个问题:
//在线程中调用可视化组件
delegate void SetTreeViewContactListCallback(string nodeText);
private void SetTreeViewContactList(string nodeText)
{
if (this.m_treeViewContact.InvokeRequired)
{
SetTreeViewContactListCallback tcc = new SetTreeViewContactListCallback(SetTreeViewContactList);
this.Invoke(tcc, new object[] { nodeText});
}
else
{
this.InitTreeViewContactList(nodeText);
}
}
private void InitTreeViewContactList(string nodeText)
{
TreeNode _treeNode;
_treeNode = this.m_treeViewContact.Nodes.Add(nodeText);
}
当OnReceiveBuffer事件抛出联系人数据的时候,调用SetTreeContactList函数就可安全正确的操作TreeView,将联系人写入TreeView。