Simple TCP server using TPL
private void ProcessTransactionAsync(Socket socket)



You've mixed the naming conventions a little bit. We add the Async suffix to methods that are awaitable. This one isn't. You could however easily fix it.




private void ProcessTransaction(Socket socket)
{
    Task.Factory.StartNew(() =&gt; ProcessTransactionAsync(socket));
}



Rename it and mark it propertly with async. Let its return value be Task. In place of the Task.Factory.StartNew you can use the shortcut Task.Run(someAction):

private async Task ProcessTransactionAsync(Socket socket)
{
    await Task.Run(() =&gt; ProcessTransaction(socket));
}


now you can await it in StartListen:

while (!_shutdown)
{
    var socket = await AcceptClient();
    await ProcessTransaction(socket);
}


finally as Ron Beyer wrote you should change the return value of the StartListen method to Task.