服务总线中继是否支持异步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;
}
答案 0 :(得分:1)
Azure cannot tell whether you have implemented your service synchronously or asynchronously.这是一个未在写入时公开的实现细节。无论出现问题的原因是什么 - 并不是因为与您的服务通信的远程端会受到异步的影响。
事实上,您可以独立决定客户端和服务器是否要使用异步。
使用给出的代码,如果超时低于5分钟,则应始终看到超时错误,因为服务器需要5分钟才能应答。不是服务器立即返回在5分钟后完成的IAsyncResult
的情况。 IAsyncResult
不可序列化,因此它永远不会过时。什么都没发送5分钟。
与此问题无关:使用await
实现异步。更容易。
您当前的服务器实现存在问题:您使用同步睡眠阻止线程持续5分钟。这完全否定了异步的好处。如果你有许多这样的操作同时执行,这将导致线程池耗尽。