gpt4 book ai didi

c# - 在套接字读取之前替代 Thread.Sleep()

转载 作者:行者123 更新时间:2023-11-30 15:45:51 28 4
gpt4 key购买 nike

我正在使用这个 FtpClient 库从 WinForms 应用程序连接到大型机。我正在使用 thread.Sleep 让线程在开始读取之前等待响应,否则它会卡住。有替代方法吗?

public void Login() 
{
if (this.loggedin) this.Close();

Debug.WriteLine("Opening connection to " + this.server, "FtpClient");

IPAddress addr = null;
IPEndPoint ep = null;

try
{
this.clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
addr = Dns.Resolve(this.server).AddressList[0];
ep = new IPEndPoint(addr, this.port);
this.clientSocket.Connect(ep);
}
catch (Exception ex)
{
// doubtfull
if (this.clientSocket != null && this.clientSocket.Connected) this.clientSocket.Close();

throw new FtpException("Couldn't connect to remote server", ex);
}

**Thread.Sleep(4000);**
this.readResponse();
...
}

private void readResponse()
{
this.message = "";
this.result = this.readLine();

if (this.result.Length > 3)
this.resultCode = int.Parse(this.result.Substring(0, 3));
else
this.result = null;
}

private string readLine()
{
while (true)
{
this.bytes = clientSocket.Receive(this.buffer, this.buffer.Length, 0);
this.message += ASCII.GetString(this.buffer, 0, this.bytes);

if (this.bytes < this.buffer.Length) break;
}

string[] msg = this.message.Split('\n');
if (this.message.Length > 2)
{
this.message = msg[msg.Length - 2];
try { response = msg[msg.Length - 3]; }
catch { }
}
else
{
this.message = msg[0];
}

if (this.message.Length > 4 && !this.message.Substring(3, 1).Equals(" ")) return this.readLine();

if (this.verboseDebugging)
{
for (int i = 0; i < msg.Length - 1; i++)
{
Debug.Write(msg[i], "FtpClient");
}
}
return message;
}

public void sendCommand(String command)
{
if (this.verboseDebugging) Debug.WriteLine(command, "FtpClient");

Byte[] cmdBytes = Encoding.ASCII.GetBytes((command + "\r\n").ToCharArray());
clientSocket.Send(cmdBytes, cmdBytes.Length, 0);
this.readResponse();
}

最佳答案

使用异步编程模型:

socket.BeginConnect(ep, new AsyncCallback(Connected), socket);

void Connected (IAsyncResult result)
{
var socket = (Socket)result.AsyncState;

// do the stuff

socket.EndConnect(result);
}

关于c# - 在套接字读取之前替代 Thread.Sleep(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4816596/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com