1

TcpClient から継続的にデータを読み込もうとしています。これが私のコードスニペットです。

var task = Task.Factory.StartNew(Read);

task.ContinueWith(ant =>
     Console.WriteLine("Error: " + ant.Exception.Message),
     TaskContinuationOptions.OnlyOnFaulted);

task.ContinueWith(ant =>
     {
         Log("Log my data");
     });


void Read()   
{
   Task<int> readChunk = Task<int>.Factory.FromAsync(
              _stream.BeginRead, _stream.EndRead,
              data, bytesRead, data.Length - bytesRead, null,
              TaskCreationOptions.AttachedToParent);

   readChunk.ContinueWith(rt => { bytesRead = readChunk.Result; }, TaskContinuationOptions.NotOnFaulted
                                            | TaskContinuationOptions.AttachedToParent);
}

このコードは正常に動作しますが、ストリームにはさらにデータが来る可能性があるため、戻ってもう一度読み取る必要があります。別の読み取りタスクを開始するのは正しくないようです。私はタスク並列ライブラリに慣れていません。通常、私は次のようなものを書いていたでしょう:

while (true)
{
   bytesRead += _stream.Read(data, bytesRead, chunkSize);
   if(bytesRead == BytesExpected)
       break;
}
4

0 に答える 0