gpt4 book ai didi

c# - NancyFx 自托管休息服务无法处理并行查询

转载 作者:行者123 更新时间:2023-11-30 16:51:35 27 4
gpt4 key购买 nike

我想了解为什么我的示例项目中的 nancyFx 无法处理并行查询。我正在运行 Windows 8、VS2015、C#、fiddler 4。

这是我的示例服务:

class Program
{
static void Main(string[] args)
{
Listen();
}

static void Listen()
{
using (var host = new NancyHost(new Uri("http://localhost:4546")))
{
host.Start();
Console.ReadLine();
}
}
}

public class TestModule : NancyModule
{
public TestModule() : base("/")
{
Get["/"] = (param) =>
{
Debug.WriteLine("Start:" + DateTime.Now.TimeOfDay.ToString());
Thread.Sleep(100);
Debug.WriteLine("End:" + DateTime.Now.TimeOfDay.ToString());
return Response.AsText("Success");
};
}
}

这是示例查询:

GET http://localhost:4546/ HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: ru-RU
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: localhost:4546
Connection: Keep-Alive

我使用 fiddler 4 生成并行查询(重放功能)并测量查询运行时间。

当我运行一个查询时 - 处理时间约为 100 毫秒 (0:00:00.104),但是当我运行多个查询时 - 处理时间增长太多,这里是示例: Fiddler parallel queries screenshot enter image description here和调试输出:

Start:09:56:32.8385200
Start:09:56:32.8443855
End:09:56:32.9396601
End:09:56:32.9455256
Start:09:56:32.9465022
End:09:56:33.0478691
Start:09:56:33.0478691
End:09:56:33.1498256
Start:09:56:33.1507976
End:09:56:33.2516390
Start:09:56:33.2535998
End:09:56:33.3554522
Start:09:56:33.3564277
End:09:56:33.4584340
Start:09:56:33.4594080
End:09:56:33.5608216
Start:09:56:33.5617992
End:09:56:33.6631615
Start:09:56:33.6641370
End:09:56:33.7649969
Start:09:56:33.7659714
End:09:56:33.8673301
Start:09:56:33.8683072
End:09:56:33.9696905
Start:09:56:33.9706676
End:09:56:34.0713212
Start:09:56:34.0722972
End:09:56:34.1729940
Start:09:56:34.1759211
End:09:56:34.2774876

正如我们在 fiddler 时间轴中看到的那样 - 所有查询同时开始运行,但执行时间不同。

我们也可以用不同的负载替换 Thread.Sleep,但行为仍然相同。

我们还可以用 RestSharp 和 HttpClient 替换 fiddler 来生成查询 - 行为仍然相同。

我们也可以用 ServiceStack.Server 替换 NancyFx(也是自托管的)——行为仍然相同。

为什么? :) 我该如何解决?

更新:另外,根据@FireAlkazar 的猜测,我试图删除 Debug.WriteLine。

现在代码是:

Get["/"] = (param) => { 
var response = Response.AsText("");
Thread.Sleep(100);
return response;
};

结果是一样的,这里是截图:here is it

最佳答案

你们试过让方法异步吗? true 参数告诉 Nancy 以异步方式运行,而 async 关键字告诉 VS 其中的代码将返回一个 Task 或具有 await 关键字...注意我没有测试过这段代码,因为我正在使用它有点复杂的方法,但它应该运行。

Get["/", true] = async (param, ct) => { 
var response = Response.AsText("");
Thread.Sleep(100);
return Task.FromResult<string>(response);
};

关于c# - NancyFx 自托管休息服务无法处理并行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33706005/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com