ManualResetEvent

  1. ManualResetEvent 可以认为是个锁, 当它是false的时候,所有的线程被阻塞,当它是true的时候,所有的线程被释放,继续向下进行,reset()的时候,它是false(所有线程被阻塞),set()的时候,它是true(所有线程被释放)

1.1) public static ManualResetEvent allDone = new ManualResetEvent(false); 我们一般默认阻塞注线程

allDone().reset()重置为false阻塞线程

allDone.set()释放线程

Bool flag= allDone.waitOne(2000);阻塞注2秒 不管成不成功都向下进行,只是需要判断flag的标志,写业务逻辑(true or false)

public static ManualResetEvent allDone = new ManualResetEvent(false);  //就当是线程信号控制,默认阻塞所有的线程

        public static void ConnectCallback1(IAsyncResult ar)

        {

//这里是当allDone.waitOne()后执行,也不能说allDone.waitOne()触发,但是应该在它后面吧,而且是连接成功后,才到的这里,这里allDone.set()设置为了false,并把结果给了waitOne()

            Console.WriteLine("3333333333333333");

            allDone.Set();

            Console.WriteLine("44444444444444");

            Socket s = (Socket)ar.AsyncState;

            s.EndConnect(ar);

        }

        private void asyncConnect() {

            try

            {

                //https://docs.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket?view=netframework-4.7.2

                Object obj = new object();

                socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                allDone.Reset();

                //socketClient.BeginConnect(host, port,new AsyncCallback(ConnectCallback1) ,obj);

                IAsyncResult result = socketClient.BeginConnect(host, port, new AsyncCallback(ConnectCallback1), socketClient);//最后一个参数是socket,而不能随便是个对象

                Console.WriteLine("1111111111111");

//当连接按钮点击,socket异步连接后,阻塞在waitOne(2000),2秒,如果么有2000,则永久阻塞,知道allDone.set()被触发,2秒钟是,等待2秒钟,当有set()直接向下走,不等待2秒钟,如果没有被set(),需要等待2秒钟,然后判断falg是true还是false,执行不同的操作

                bool flag = allDone.WaitOne(2000);

                Console.WriteLine("waitOne result ="+flag);

if (flag)

                {

                    MessageBox.Show("flag=false,连接成功");

                }

                else {

                    MessageBox.Show("flag=false,连接不成功");

                }

                

                Console.WriteLine("2222222222222222222");

                MessageBox.Show(socketClient.Connected+"");

                MessageBox.Show("异步连接成功");

            }

            catch (Exception ex) {

                MessageBox.Show("异步连接失败"+ex.Message);

            }

        }

public bool connectServer(int timeout = 5)

        {

//这个应该不标准,但是应该用没有问题,不是官方那种模式,上面的是官方的模式

            try

            {

                clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                IAsyncResult connResult = clientSocket.BeginConnect(serverIP, serverPort, null, null);

                connResult.AsyncWaitHandle.WaitOne(2000, true);

                if (!clientSocket.Connected)

                {

                    clientSocket.Close();

                    MessageBox.Show("开启网络失败");

                    //处理连接不成功的动作

                    socketFlag = false;

                    return false;

                }

                else

                {

                    //处理连接成功的动作

                    socketFlag = true;

                    Timeout = timeout;

                    return true;

                }

            }

            catch (Exception ex)

            {

                socketFlag = false;

                if (timeoutTimer != null && timeoutTimer.Enabled)

                {

                    stopTimeoutTimer();

                }

                throw;

            }

        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值