2011-01-27 2 views
3

Я использую эту библиотеку FtpClient для подключения к мэйнфрейму из приложения WinForms. Я использую thread.Sleep для потока, чтобы дождаться ответа, прежде чем он начнет чтение, иначе он зависает. Есть ли альтернатива этому?Альтернатива 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(); 
} 

ответ

4

Использование асинхронной модели программирования:

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

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

    // do the stuff 

    socket.EndConnect(result); 
} 
+0

Его работа для входа в систему, но при отправке других команд (загрузка/загрузка) я получаю эту ошибку «Невозможно заблокировать вызов этого сокета, когда выполняется более ранний асинхронный вызов». – user558138

+0

@ user558138: Извините, забыл сказать, что вам нужно вызвать 'EndConnect()' – abatishchev

+0

. Я все еще получаю ту же ошибку. clientSocket.Send (cmdBytes, cmdBytes.Length, 0); // в этой строке – user558138

0

Да, если вы можете работать с .NET 4.0, у вас есть API-интерфейс задачи.

Вы можете узнать больше, прочитав эту статью: http://www.codethinked.com/post/2010/01/25/NET-40-and-SystemThreadingTasks.aspx

Это дает вам способ создания потока, в котором задача ждет, пока предыдущая не закончилась. Взглянуть!

0

Дать Thread.Sleep() действительно плохая практика.

Если вы на самом деле делает FTP-клиент, используйте FtpWebRequestBeginGetResponse(asynccallback, object)

И передать readResonse как обратный вызов. Он будет называться точно, когда ответ будет готов.

+0

Плохая практика? Думаю, нет. Но да, есть и другие подходы, которые могут работать. – stefan

+0

Хорошо, скажем, это доказательство плохого дизайна, затем http://stackoverflow.com/questions/1457282/alternatives-to-thread-sleep-for-simulating-pauses – rds

+0

Я не согласен с этой статьей. его умозрительный вопрос о том, почему вы используете thread.sleep(). спать нить в моей книге хороший способ сказать: «Мне нечего делать, пожалуйста, сделайте что-то, прежде чем я снова попробую». Все еще. Моя идея приличного сна - <100 миллисекунд, а не секунды или минуты. – stefan

Смежные вопросы