0

ファイルを送受信するために(クライアント)と(マルチクライアントサーバー)を持つ単一のプログラムを入力しようとし ました転送は完全に成功しましたが、データを転送するとプログラムは(応答しません)終了すると正常に戻ります

リンクでプロジェクトをダウンロードできます: 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();
4

1 に答える 1

4

コードのような通常の IO がブロックされています。つまり、コードを実行しているスレッドは、転送が完了するまで待機する必要があります。このスレッドがプログラムのメイン スレッドである場合、終了するまでプログラムがユーザー入力に応答しなくなります (「応答なし」)。

ブロッキング IO を実行しているときにプログラムをレスポンシブにする方法は 2 つあります。

  • 非同期 IO を使用する
  • 別のスレッドで転送を実行します

あなたの場合、おそらく2番目のオプションの方が簡単だと思います。

ThreadPool.QueueUserWorkItem または BackgroundWorker を使用してください。説明と詳細については、この記事を参照してください。

于 2012-08-10T23:39:39.957 に答える