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

Does azure service bus relay support async wcf opertions?

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

我得到服务器无法 return 一个有意义的响应,代码如下。如果我将时间跨度更改为 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;
}

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

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

使用给定的代码,如果超时时间低于 5 分钟,您应该始终会看到超时错误,因为服务器需要 5 分钟来响应。服务器不会立即 returns 一个 IAsyncResult 并在 5 分钟后完成。 IAsyncResult 不可序列化,因此它永远不会通过网络传输。 5 分钟内什么也没有发送。

与本题无关:使用await实现异步。容易多了。

您当前的服务器实现有一个问题:您在同步睡眠时阻塞线程 5 分钟。这完全否定了异步的好处。如果同时执行许多此类操作,这将导致线程池耗尽。