azure服务总线中继是否支持异步wcf操作?

时间:2015-01-05 15:44:44

标签: azure azureservicebus azure-servicebusrelay

服务总线中继是否支持异步wcf操作?

我使服务器无法使用以下代码返回有意义的响应。如果我将时间跨度改为30秒,虽然它可以正常工作。

从本教程开始 http://azure.microsoft.com/en-us/documentation/articles/service-bus-dotnet-how-to-use-relay

客户代码:

var task = Task<string>.Factory.FromAsync(channel.BeginDoEcho, channel.EndDoEcho, input, null);
Console.WriteLine("Server echoed: {0}", task.Result );

服务器代码:

public IAsyncResult BeginDoEcho(string text, AsyncCallback callback, object state)
{
    var task = Task<string>.Factory.StartNew(x =>
    {
        Thread.Sleep(TimeSpan.FromMinutes(5));
        return text;
    }, state);
    return task.ContinueWith(result => callback(task));
}

public string EndDoEcho(IAsyncResult result)
{
    return ((Task<string>) result).Result;
}

1 个答案:

答案 0 :(得分:1)

Azure cannot tell whether you have implemented your service synchronously or asynchronously.这是一个未在写入时公开的实现细节。无论出现问题的原因是什么 - 并不是因为与您的服务通信的远程端会受到异步的影响。

事实上,您可以独立决定客户端和服务器是否要使用异步。

使用给出的代码,如果超时低于5分钟,则应始终看到超时错误,因为服务器需要5分钟才能应答。不是服务器立即返回在5分钟后完成的IAsyncResult的情况。 IAsyncResult不可序列化,因此它永远不会过时。什么都没发送5分钟。

与此问题无关:使用await实现异步。更容易。

您当前的服务器实现存在问题:您使用同步睡眠阻止线程持续5分钟。这完全否定了异步的好处。如果你有许多这样的操作同时执行,这将导致线程池耗尽。