跨线程调用窗体控件
对于跨线程调用窗体控件,用的最多且最常用的方法一般是使用委托结合Invoke实现的。下面是我曾经使用该方式而实现跨线程调用的一段代码。
/// <summary> /// 委托,用以其它线程调用该委托获取当前选择的节点的文本 /// </summary> /// <returns></returns> public delegate string GetNodeText(); private string GetText() { return this.m_ParentNode.TreeView.SelectedNode.Text; } /// <summary> /// 导出数据 /// </summary> /// <param name="filePath">保存文件路径</param> private void ExprotData(object filePath) { string nodeText = ""; if (this.m_ParentNode.TreeView.InvokeRequired) { nodeText = (string)this.m_ParentNode.TreeView.Invoke(new GetNodeText(GetText)); } else { nodeText = this.m_ParentNode.TreeView.SelectedNode.Text; } IHotspotTaskPara hotspotTaskPara = this.m_SubSystemPara.HotspotTaskManager. FindTask(nodeText); this.m_SubSystemPara.ExportResultData.ExportResultData(hotspotTaskPara, filePath as string); }
从代码中可以看到函数中使用到了属性InvokeRequired,该属性值指示调用方在对控件进行方法调用时是否必须调用Invoke方法,即表示调用当前控件的线程是否与窗体控件所在线程相同。