SignalR教程6-服务器异步执行

Keywords:

1. 什么时候异步执行

如果一个方法耗时较长或者必须进行部分等待工作,例如数据库检索或者调用一个web service,为了使集线器hub方法异步,返回的方法是返回一个Task(而不是void)或者Task<T>object (而不是T 返回对象).当返回一个Task对象,SignalR 将会等待Task完成,然后发送unwrapped结果返回给客户端,使用异步调用客户端的代码没有变化的。

hub方法异步可以在使用WebSocket传输时避免连接阻塞,当hub方式异步执行方法的时候在调用方法的那个客户端内子队列方法会等待直到hub方法完成。(其他客户端不受影响)。

下面的例子展示了同样的一个方法,在客户端和服务器端使用同步和异步方法。

同步

public IEnumerable<Stock> GetAllStocks()
{
// Returns data from memory.
return _stockTicker.GetAllStocks();
}

异步

public async Task<IEnumerable<Stock>> GetAllStocks()
{
   // Returns data from a web service.
   var uri = Util.getServiceUri("Stocks");
   using (HttpClient httpClient = new HttpClient())
   {
       var response = await httpClient.GetAsync(uri);
       return (await response.Content.ReadAsAsync<IEnumerable<Stock>>());
   }
}

JavaScript 客户端代码

stockTickerHubProxy.server.getAllStocks().done(function (stocks) {
   $.each(stocks, function () {
       alert(this.Symbol + ' ' + this.Price);
   });
});

更多关于在ASP.NET 4.5中使用同步和异步方法,见Using Asynchronous Methods in ASP.NET MVC 4.

2. 定义重载Defining Overloads


如果想定义一个方法的重载,每个重载的输入参数个数必须不同,如果使用参数类型不同方式区别重载,编译会成功但SignalR service将会抛出异常,当客户端调用其中一个重载的时候。

3.hub method汇报进度

SignalR 2.1 添加了  progress reporting pattern in .NET 4.5. 汇报进度支持定义一个IProgress<T> 参数 。

public class ProgressHub : Hub
{
   public async Task<string> DoLongRunningThing(IProgress<int> progress)
   {
       for (int i = 0; i <= 100; i+=5)
       {
           await Task.Delay(200);
           progress.Report(i);
       }
       return "Job complete!";
   }
}

当写一个运行耗时长的方法,使用一个异步模式,例如Async/ Await ,而不让hub thread阻塞.


作者:songshizhao 发表于:2017-11-09T01:49:13 访问量:272