void cmdConnectTargetKClient_Click(object sender, EventArgs e) { try { IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(cboTargetKClientAddress.Text), Convert.ToInt32(txtTargetKClientPort.Text)); Thread kcWorkerThread; var wh = _kClient.EnterNetwork(ipep, out kcWorkerThread); Thread thread = new Thread(delegate() { Invoke(new Action(() => { cmdConnectTargetKClient.Enabled = false; })); TimeSpan passedTime = TimeSpan.Zero; while (kcWorkerThread.IsAlive && !wh.SafeWaitHandle.IsClosed && passedTime < TimeSpan.FromSeconds(3)) { wh.WaitOne(TimeSpan.FromMilliseconds(10)); passedTime += TimeSpan.FromMilliseconds(10); } if (_kClient.ConnectionList.Count > 0) { Invoke(new Action(() => { cmdConnectTargetKClient.Enabled = true; groupBox2.Enabled = false; })); } else { Invoke(new Action(() => { cmdConnectTargetKClient.Enabled = true; })); } }); thread.IsBackground = true; thread.Start(); } catch (Exception ex) { Log(ex.Message); Log(ex.StackTrace); } }
void cmdConnectToTargetKClient_Click(object sender, EventArgs e) { try { IPEndPoint ipep = KeiUtil.ParseIPEndPoint(cboTargetKClientEndPoint.Text); Thread kcWorkerThread; for (var i = 0; i < 1; i++) { //Thread.Sleep(1500); WaitHandle wh; if (KeiGuiOptions.Current.IsPointInsertion) { wh = _kClient.EnterNetwork(ipep, Convert.ToUInt16(txtLocalKClientPort.Text), out kcWorkerThread); } else { // 普通用户 wh = _kClient.EnterNetwork(ipep, 0, out kcWorkerThread); } Thread thread = new Thread(delegate() { Invoke(new Action(() => { cmdConnectToTargetKClient.Enabled = false; })); TimeSpan passedTime = TimeSpan.Zero; while (kcWorkerThread.IsAlive && !wh.SafeWaitHandle.IsClosed && passedTime < TimeSpan.FromSeconds(3)) { wh.WaitOne(TimeSpan.FromMilliseconds(10)); passedTime += TimeSpan.FromMilliseconds(10); } if (_kClient.ConnectionList.Count > 0) { Invoke(new Action(() => { if (!_kClient.IsActive) { // 普通用户此时启动 // 不过确实,想想,对于普通用户,如果是端口在从 TestBind() 到现在(即,点下“启动”按钮到点下“连接”按钮并成功) // 这段时间内,该K客户端端口被占用了怎么办?这里就会直接异常,线程崩溃了…… _kClient.Listen(); } cmdConnectToTargetKClient.Enabled = false; groupBox2.Enabled = false; KGState = KeiGuiState.Connected; if (!cboTargetKClientEndPoint.Items.Contains(cboTargetKClientEndPoint.Text)) { cboTargetKClientEndPoint.Items.Add(cboTargetKClientEndPoint.Text); } SetStatusText("已经连接到 " + cboTargetKClientEndPoint.Text + ",开始工作 [" + _kClient.ConnectionList.Count.ToString() + "]"); mnuOpForceBroadcast.Enabled = true; ctxForceBroadcast.Enabled = true; })); } else { Invoke(new Action(() => { cmdConnectToTargetKClient.Enabled = true; SetStatusText("未能连接到 " + cboTargetKClientEndPoint.Text); })); } }); thread.IsBackground = true; thread.Start(); } } catch (Exception ex) { Program.Logger.Log(ex.Message); } }