在我的ASP.NET API中,我收到了一系列要保留的消息。在這種特殊情況下,API的響應性取代了任何單個消息的重要性,所以我不是直接寫入數據存儲,而是將傳入消息推送到隊列並在後臺線程上儘快處理它們。使用帶有隊列和後臺線程的TaskCompletionSource
在某些情況下,我可能有一個需要確認的寫操作的成功或失敗,所以我在使用下面的代碼定製MessageContext的對象纏上了我的消息:
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);
}
}
成功和錯誤方法旨在由在後臺處理每個排隊消息的工作線程調用。然後,在我的控制,我可以這樣做:
var ctx = new WriteMessageContext(msg);
queue.Enqueue(ctx);
// optionally...
if (await ctx.WaitForIt()) {
// successful
} else {
// or not
}
這是一個合適的使用TaskCompletionSource的+異步/等待,還是我用wreckless放棄bastardizing呢?是否有任何潛在的問題我應該關注這樣做?
我會推薦使用'TaskCreationOptions.RunContinuationsAsynchronously'和'TaskCreationOptions.DenyChildAttach'標誌。 –