1

服务总线中继是否支持异步 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;
}
4

1 回答 1

1

Azure 无法判断您是同步还是异步实现了服务。这是一个未在写入时公开的实现细节。无论您的问题的原因是什么 - 与您的服务通信的远程端都不会受到异步的影响。

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

使用给定的代码,如果超时时间低于 5 分钟,您应该总是看到超时错误,因为服务器需要 5 分钟来回答。服务器不会立即返回IAsyncResult5 分钟后完成的情况。IAsyncResult不可序列化,因此它永远不会越过网络。5分钟内什么都没有发送。

与此问题无关:await用于实现异步。容易得多。

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

于 2015-01-11T11:55:07.157 回答