使用套接字传输文件但在传输数据c#时没有程序(没有响应)

时间:2012-08-10 23:33:13

标签: c# file sockets transfer

我尝试键入单个程序(客户端)和(多客户端服务器)来发送和接收文件 传输完全成功,但程序(无响应)传输数据并在完成时返回正常

您可以使用链接下载项目: http://www.mediafire.com/?81gs1zqbsgqldwb

请在程序传输数据时帮我解决(无响应)???

发送机制:

byte[] buffer = new byte[packetSize];
while (sum < length)
{
    if (length - sum > packetSize)
    {
        count = fileStream.Read(buffer, 0, packetSize);
        Send(socket_File, buffer);
    }
    else
    {
        buffer = new byte[length - sum];
        count = fileStream.Read(buffer, 0, length - sum);
        Send(socket_File, buffer);  
    }
    sum = sum + count;
}
fileStream.Close();

接收机制:

string path = Save_File.FileName;
FileInfo fi = new FileInfo(path);
FileStream fs = fi.OpenWrite();
byte[] buffer = new byte[packetSize];

while (sum < File_Size)
{
    if (File_Size - sum > packetSize)
    {
        count = Socket_File_Client.Receive(buffer, 0, packetSize, 0);
        fs.Write(buffer, 0, count);
    }
    else
    {
        buffer = new byte[File_Size - sum];
        count = Socket_File_Client.Receive(buffer, 0, File_Size - sum, 0);
        fs.Write(buffer, 0, count);
    }
    sum = sum + count;
}
fs.Close();

1 个答案:

答案 0 :(得分:4)

代码中的常规IO阻塞。这意味着执行代码的线程必须等到传输完成。如果此线程是程序中的主线程,那么它将导致程序无法响应用户输入(“无响应”),直到完成。

有两种方法可以在阻止IO时使程序响应:

  • 使用异步IO
  • 在另一个主题中运行您的转移

我认为第二种选择在你的情况下可能更容易。

只需使用ThreadPool.QueueUserWorkItem或BackgroundWorker即可。有关说明和详细信息,请参阅this article