 <p>Your communication classes shouldn't care what happens to the data they receive. Instead, they should either make the data available to a class that wants it. One way to do so would be to provide a getData() method, which received data and then returned it to the caller. Even better would be to provide a DataArrived event, which was fired whenever you received data. That way, any number of consumers could listen for data, but your communication code doesn`t have to know which classes are listening or what they plan to do with the data.</p> <p><strong>EDIT</strong>:</p> <p>A simple example:</p> <pre><code>public class MyClassWithEvent { public delegate void DataArrivedDelegate(string data); public event DataArrivedDelegate DataArrived; public void GetSomeData() { // Communication code goes here; stringData has the data DataArrivedDelegate handler = DataArrived; if (handler != null) { // If you want to raise the event on this thread, this is fine handler(stringData); } } } </code></pre> <p>In your listener class:</p> <pre><code>public MyListener { public MyListener(MyServer server) { // Sets MyListenerMethod to be called when DataArrived is raised server.DataArrived += MyListenerMethod; } public void MyListenerMethod(string data) { // Do something with the data Console.WriteLine(data); } } </code></pre>