O, you have helped me understand these methods better. But to clear things up in what im trying to achieve..........The bottom line is I want to be able to read data as it is sent down the stream over time.....Thus my program needs to be able to constantly monitor the stream in-order to react as it were when data(messages) are there to be read off. So in my meain theard after the TCP connection has been set up I call a method which contains the following: if(stream.CanRead) { byte[] myReadBuffer = new byte[2048]; stream.BeginRead(myReadBuffer, 0, myReadBuffer.Length, new AsyncCallback(myReadCallBack),stream); } After this is called the callback method is called (were the seperate thread executes) The code in there looks like this: public void myReadCallBack(IAsyncResult result) { NetworkStream str = (NetworkStream) result.AsyncState; byte[] myReadBuffer = new byte[2048]; int numberOfBytesRead = 0; numberOfBytesRead = str.EndRead(result); myCompleteMessage = String.Concat(myCompleteMessage, Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead)); while(str.DataAvailable) { str.BeginRead(myReadBuffer, 0, myReadBuffer.Length, new AsyncCallback(myReadCallBack),stream); } if(stream.DataAvailable == false) { TokenizeCommands(myCompleteMessage); myCompleteMessage = ""; str.BeginRead(myReadBuffer, 0, myReadBuffer.Length, new AsyncCallback(myReadCallBack),stream); } } } Thats the code. So im trying to achieve structure that will monitor data when it becomes available on the stream but in an iterative way so the main thread can continue to do other things but react when messages become available on the stream. thanks for ya help, its difficult for me to explain as im a student to this, but im getting there :) cheers mIKE