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;
}