C # Processing job cancellations, wait times, and exceptions

I am very new to tasks, and therefore to managing job cancellations and job exceptions.

I've written this method that gets a list that is then used to populate an ObsservableCollection collection displayed in a list but I'm not sure I can handle cancellations and exceptions correctly.

I would like to cancel the expected tasks if they do not perform properly within 10 seconds. In addition, I would like to handle all the exceptions and release all the resources correctly. Therefore, I use the "using" instructions below.

public replacement async Task <IList> GetDataAsync (string id)
{
try
{
// 1. TcpClient connection can take up to 90 seconds? How to time it up to 10sec?
using (client TcpClient = new TcpClient (ip, port))
using (NetworkStream stream = client.GetStream ())
{
byte[] messageBytes = GetMessageBytes (Id);

using (var writeCts = new CancellationTokenSource (TimeSpan.FromSeconds (10)))
{
wait stream.WriteAsync (messageBytes, 0, messageBytes.Length, writeCts.Token);
wait stream.FlushAsync (); // 2. Do I even need that?
}

byte[] buffer = new byte[1024];
StringBuilder builder = new StringBuilder ();
int bytesRead = 0;

using (var readCts = new CancellationTokenSource (TimeSpan.FromSeconds (10)))
{
while (stream.DataAvailable)
{
bytesRead = wait stream.ReadAsync (buffer, 0, buffer.Length, readCts.Token);
builder.AppendFormat ("{0}", Encoding.ASCII.GetString (buffer, 0, bytesRead));
}
}

string msg = receiveMessage.ToString ();
}

return ParseMessageIntoList (msg); // analyze the message in IList
    }
catch (OperationCancelledException ex1)
{
// 3. If the waiting time of 10 seconds expires, I wait to touch this block but I do not see it happen?
Debug.WriteLine (ex.Message);
}
catch (Exception ex2)
{
// Catch any other exception and return an empty list
go back Waiting Task.FromResult <IList> (new list());
}
}