In meiner ASP.NET-API erhalte ich eine Reihe von Nachrichten, die beibehalten werden sollen. In diesem speziellen Fall ersetzt die Reaktionsfähigkeit der API die Wichtigkeit jeder einzelnen Nachricht. Anstatt also direkt in meinen Datenspeicher zu schreiben, schiebe ich die eingehenden Nachrichten in eine Warteschlange und bearbeite sie so schnell wie möglich in einem Hintergrundthread.Verwenden von TaskCompletionSource mit einer Warteschlange und einem Hintergrundthread
In einigen Fällen kann ich eine Notwendigkeit, den Erfolg oder Misserfolg des Schreibvorgangs zu bestätigen, so dass ich meine Nachricht in einer benutzerdefinierten Message Objekt wickeln, das den folgenden Code verwendet:
public class WriteMessageContext
{
public Message Message { get; private set; }
TaskCompletionSource<bool> complete = new TaskCompletionSource<bool>();
public WriteMessageContext(Message message)
{
Message = message;
}
public Task<bool> WaitForInsert()
{
return complete.Task;
}
public void Success()
{
complete.SetResult(true);
}
public void Error()
{
complete.SetResult(false);
}
}
Der Erfolg und die Fehlermethoden sollen vom Worker-Thread aufgerufen werden, der jede in der Warteschlange befindliche Nachricht im Hintergrund verarbeitet. Dann in meinem Controller, kann ich:
var ctx = new WriteMessageContext(msg);
queue.Enqueue(ctx);
// optionally...
if (await ctx.WaitForIt()) {
// successful
} else {
// or not
}
Ist dies eine angemessene Nutzung von TaskCompletionSource + async/erwarten, oder ich bin bastardizing es mit wreckless verlassen? Gibt es irgendwelche potenziellen Probleme, die ich damit umgehen sollte?
Ich würde die Flags 'TaskCreationOptions.RunContinuationsAsynchronChrome' und 'TaskCreationOptions.DenyChildAttach' empfehlen. –