public class MyNetworkClient { public async Task ConnectAsync(string address) { await this.MakeTheActualConnection(address); this.BeginReceiveLoop(); } // It's async void! But is that bad? // I know that an unhandled exception here is going to bring down the process, but where else do you want // that exception to go? There's no external control flow that can reasonably receive such an exception. private async void BeginReceiveLoop() { while (true) { var incomingBlock = await this.networkStream.ReadAsync(); if (incomingBlock == null) { // Disconnected or disposed return; } else { this.DoSomething(incomingBlock); } } } }