簡體   English   中英

傳輸數據時,使用套接字傳輸文件但程序(無響應)進行傳輸

[英]Transfer file with socket but program (not responding) when transfer data c#

我嘗試鍵入一個具有(客戶端)和(多客戶端服務器)的單個程序來發送和接收文件傳輸完全成功,但是當程序傳輸數據時該程序(不響應)並在完成時返回正常

您可以通過以下鏈接下載該項目: 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();

代碼中的常規IO處於阻塞狀態。 這意味着執行代碼的線程將必須等待,直到傳輸完成。 如果此線程是程序中的主線程,則它將導致您的程序在完成之前對用戶輸入無響應(“無響應”)。

您可以通過兩種方法在阻止IO時使程序響應:

  • 使用異步IO
  • 在另一個線程中運行傳輸

我認為第二種選擇可能更適合您的情況。

只需使用ThreadPool.QueueUserWorkItem或BackgroundWorker。 請參閱本文以獲取解釋和詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM