异步
原文地址:https://github.com/NancyFx/Nancy/wiki/Async
语法
不管是 Before/After通道还是主要路径委托都可以指定为异步。语法和同步代码几乎是一样,除了下面这的这些小变化:
·· Before/After 钩子函数有两个参数,比同步语法的Context多了一个cancellation token(防伪标识).
··路径定义多了一个boolean型参数,委托有两个参数,captured param(拍摄参数?)和cancellation token(防伪标识).
异步例子:
publicMainModule()
{
Before += async(ctx, ct) =>
{
this.AddToLog("Before Hook Delay\n");
awaitTask.Delay(5000);
returnnull;
};
After += async(ctx, ct) =>
{
this.AddToLog("After Hook Delay\n");
awaitTask.Delay(5000);
this.AddToLog("After Hook Complete\n");
ctx.Response= this.GetLog();
};
Get["/", true] = async (x, ct) =>
{
this.AddToLog("Delay 1\n");
awaitTask.Delay(1000);
this.AddToLog("Delay 2\n");
awaitTask.Delay(1000);
this.AddToLog("Executing async httpclient\n");
var client = new HttpClient();
var res = await client.GetAsync("http://nancyfx.org");
var content = await res.Content.ReadAsStringAsync();
this.AddToLog("Response: " + content.Split('\n')[0] + "\n");
return (Response)this.GetLog();
};
}
热任务/4.0支持
Async/await只有4.5以上的版本才支持异步请求(.net4.0以上)。如果你选择只使用TPL或者RX,那么我们希望从路径返回的Tasks是热的(已经启动),请一定要确定你从委托中所返回的任务都是热的,否则你的请求是不会有反应的。