【发布时间】:2016-11-26 06:06:02
【问题描述】:
在我的 ASP.NET API 中,我收到了一系列要持久保存的消息。在这种特殊情况下,API 的响应能力取代了任何单个消息的重要性,因此我不是直接写入我的数据存储,而是将传入的消息推送到队列并在后台线程上尽快处理它们。
在某些情况下,我可能需要确认写入操作的成功或失败,因此我将消息包装在使用以下代码的自定义 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);
}
}
Success 和 Error 方法旨在由在后台处理每个排队消息的工作线程调用。然后,在我的控制器中,我可以这样做:
var ctx = new WriteMessageContext(msg);
queue.Enqueue(ctx);
// optionally...
if (await ctx.WaitForIt()) {
// successful
} else {
// or not
}
这是对 TaskCompletionSource + async/await 的适当使用,还是我毫不犹豫地放弃了它?这样做有什么潜在的问题我应该担心吗?
【问题讨论】:
-
我建议使用
TaskCreationOptions.RunContinuationsAsynchronously和TaskCreationOptions.DenyChildAttach标志。
标签: c# .net async-await