【发布时间】:2018-04-04 08:39:23
【问题描述】:
我正在构建一个基于服务总线的应用程序。当我的receiver从服务总线获取消息时,可能需要很长时间来处理它,所以我想等待处理,但是如果时间太长,应该取消处理,消息应该是完全的。
这是我的接收器的代码:
client.OnMessageAsync(async message =>
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("message from api");
try
{
CancellationTokenSource source = new CancellationTokenSource();
source.CancelAfter(TimeSpan.FromSeconds(30));
var task = new Task(() => ProcessServiceBusMessage(message).Wait(), source.Token);
await message.CompleteAsync();
}
catch (Exception ex)
{
errLog.Error(ex.Message + ex.StackTrace);
await message.DeadLetterAsync();
}
}, new OnMessageOptions() { AutoComplete = false, MaxConcurrentCalls = 20, AutoRenewTimeout = new TimeSpan(0, 5, 0) });
如您所见,我在任务中启动了我的ProcessServiceBusMessage 函数,我等待它并在 30 秒后使用CancellationToken 取消任务(如果消息需要超过 30 秒才能完成处理),但它不起作用。
我该如何解决?
编辑:具体来说,任务不会在 30 秒后取消,而是立即执行message.CompleteAsync(),无需等待任务
谢谢。
【问题讨论】:
-
究竟什么“不起作用”?
-
任务在 30 秒后没有取消,而是立即执行
message.CompleteAsync()函数。我编辑问题以指定此详细信息 -
好的,抱歉,但它看起来像是异步的东西,我对此知之甚少。
标签: c# azure azureservicebus cancellation-token