// 这里确实有个多线程的问题,不知道到底用到了几个线程,需要解决多线程的问题吗? // http://stackoverflow.com/questions/4876414/how-to-prevent-system-timers-timer-from-queuing-for-execution-on-a-thread-pool# private void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e) { if (opcClient.Connected == false) { try { opcClient.Disconnect(); bool result = opcClient.Connect(); if (result) { if (opcClient.Connected != false) { // 添加Tags,AddTags //opcClient.AddTags1(keyTagMap); AddTagsDelegate worker = AddTagsWorker; IAsyncResult asyncResult = worker.BeginInvoke(AddTagsCompleted, worker); //this.treeListView.BeginInvoke(new AddTagsDelegate(AddTagsWorker1)); } else { } } } catch (Exception ex) { // 这里Catch 一个 System.Threading.ThreadAbortException,看起来已经catch了。 aTimer.Enabled = true; } } else { try { Console.WriteLine(); if (this.treeListView.InvokeRequired) { //this.treeListView.Invoke((MethodInvoker) delegate { DoRereshTreeList(); }); } else { //this.treeListView.Refresh(); } } catch (Exception ex) { } } aTimer.Enabled = true; }
/////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// Add a batch of tags to the opc server /// </summary> /// <param name="tags"></param> /////////////////////////////////////////////////////////////////////////////////////////// public void AddTags1(SortedDictionary <string, OPCTag> opcTags, string groupName = null, bool removeFormer = false) { Console.WriteLine("in OPCClient, AddTags1, Thread id is: " + System.Threading.Thread.CurrentThread.ManagedThreadId); AddTagsDelegate worker = AddTagsWorker; IAsyncResult asyncResult = worker.BeginInvoke(opcTags, groupName, removeFormer, AddTagsCompleted, worker); }
/// <summary> /// 【按钮】连接OPC服务器 /// </summary> private void btnConnLocalServer_Click(object sender, EventArgs e) { try { if (this.btnConnServer.Text == "连接") { if (String.IsNullOrEmpty(this.txtRemoteServerIP.Text)) { this.txtRemoteServerIP.Text = "127.0.0.1"; } opcClient.Initialize(cmbServerName.Text, this.txtRemoteServerIP.Text); bool result = opcClient.Connect(); if (!result) { // 在这里处理连接错误 MessageBox.Show("不能连接到OPC Server:" + cmbServerName.Text, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } this.btnConnServer.Enabled = false; // 启动Timer,去定时坚持是否连接正常 aTimer = new System.Timers.Timer(); aTimer.Interval = 1000; // Alternate method: create a Timer with an interval argument to the constructor. //aTimer = new System.Timers.Timer(2000); // Create a timer with a two second interval. //aTimer = new System.Timers.Timer(5000); // Hook up the Elapsed event for the timer. aTimer.Elapsed += OnTimedEvent; // Have the timer fire repeated events (true is the default) aTimer.AutoReset = false; // Start the timer aTimer.Enabled = true; TextOverlay textOverlay = this.treeListView.OverlayText as TextOverlay; textOverlay.Alignment = System.Drawing.ContentAlignment.MiddleCenter; textOverlay.TextColor = Color.Firebrick; textOverlay.BackColor = Color.AntiqueWhite; textOverlay.BorderColor = Color.DarkRed; textOverlay.BorderWidth = 4.0f; textOverlay.Font = new Font("宋体", 36); //textOverlay.Rotation = -5; textOverlay.Text = "正在加载Tag..."; this.treeListView.RefreshOverlays(); if (!treeInitialized) { InitializeTree(); } // 添加Tags,AddTags //opcClient.AddTags1(keyTagMap); AddTagsDelegate worker = AddTagsWorker; IAsyncResult asyncResult = worker.BeginInvoke(AddTagsCompleted, worker); //this.treeListView.BeginInvoke(new AddTagsDelegate(AddTagsWorker1)); this.btnConnServer.Text = "断开"; } else { aTimer.Enabled = false; aTimer = null; Thread.Sleep(1000); if (opcClient.Connected == true) { opcClient.Disconnect(); } // 这样行不行? // 显然不够,因为还得加 Column 类的 //this.treeListView = new BrightIdeasSoftware.TreeListView(); //this.treeListView.Clear(); this.treeListView.ClearObjects(); Thread.Sleep(1000); treeInitialized = false; keyTagMap.Clear(); rootTagMap.Clear(); allTagNames.Clear(); seqId = 1; lastTag = null; this.btnConnServer.Text = "连接"; this.ExpandAllNodes.Enabled = false; this.ExpandAllNodes.Text = "全部展开"; } } catch (Exception err) { MessageBox.Show("初始化出错:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning); } }