• 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;

                }

            }

  • 相关阅读:
    一个简单易用的m3u8下载器,支持下载m3u8链接或文件为mp4或ts格式
    Rust 深度学习库 Burn
    Landsat数据下载
    Flink Java Table API & SQL 之 wordcount
    MacOS 控制固态磁盘写入量,设置定时任务监控
    kubernetes部署和运行维护中的错误汇总(不定时更新)
    Leetcode 1944. Number of Visible People in a Queue (单调栈好题)
    强化学习 导论
    “华数杯”建模学习思考(Matlab&Python代码实现)
    【计算机网络】数字签名为什么能够解决信用问题
  • 原文地址:https://blog.csdn.net/fivestar2009/article/details/125505069