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