I have very similar code when using the standard BeginRead and EndRead methods from the TcpClient and using Task.Factory.FromAsync.
Here are some examples.. Error handli
I would much rather see Task based code:
Task tasks and returns another task which represents the majority verdict of those tasks. Likewise you can wait until any one of a collection of tasks has completed, etc.IAsyncResult type returned by BeginRead.Task is getting better language support in C# 5 with async/await - if your codebase already uses Task pervasively, it'll be much easier to take advantage of thisBasically in modern code running on .NET 4, Task is the idiomatic way of representing an on-going task. It's a much richer environment to work in than earlier attempts, and I would embrace it if you have the chance. Obviously if you're using .NET 3.5 or earlier, life is a bit harder, but I'm assuming that as you're asking the question, Task is an option...