Natürlich könnte ich das auch einfach asynchron abfragen - nur die Zuordnung zum richtigen Datensatz erscheint mir dann im Moment doch als einziger PITA

Wofür gibt's Closures

? Code, der Daten in einem Kontext auswerten soll
Code:
var a = Foo();
var b = Receive();
a.Process(b);
wir mit einer (asynchronen) Continuation in etwa zu
Code:
var a = Foo();
BeginReceive(b => a.Process(b));
Damit ist die Transformation doch wirklich beherrschbar

. Und alle state-Parameter sind dadurch auch überflüssig geworden.