在等待

时间:2017-10-24 14:31:26

标签: c# azure azure-functions azureservicebus

我正在尝试使用服务总线Azure功能,我接受BrokeredMessage,然后执行http请求,然后决定是否完成,放弃或死信。但是,如果我等待一个http请求,我一直在发现BrokeredMessage正在提前处理。如果我尝试使用它,它会抛出System.ObjectDisposedException: 'BrokeredMessage has been disposed.'

示例:

public static async void Run(BrokeredMessage message, TraceWriter log)
{
            var httpClient = new HttpClient()
            {
                BaseAddress = new Uri("http://google.com")
            };
            httpClient.DefaultRequestHeaders.Accept.Clear();
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            var request = new HttpRequestMessage(HttpMethod.Get, "/");
            HttpResponseMessage response = await httpClient.SendAsync(request);

            message.DeadLetter(); //Throws exception
}

我不确定我做错了什么或遗漏了什么但我无法弄清楚在等待正常工作之后如何对消息做出任何操作。

2 个答案:

答案 0 :(得分:0)

您不应该明确地致电Complete()。 Azure函数运行时将在函数成功完成时完成消息,或者在函数失败时放弃。

  

函数运行时以PeekLock模式接收消息,如果函数成功完成,则在消息上调用Complete;如果函数失败,则调用Abandon。

来自docs

答案 1 :(得分:0)

问题是函数需要返回Task而不是void才能使异步正常工作。做出改变之后,等待正确。