Asynchronous WCF service's execution is blocking
受如何:实现异步服务操作和使用任务并行库构建基于任务的 WCF 服务的启发,我正在尝试使用异步执行的操作创建 WCF Web 服务。
我的想法是,我有一个方法可以持续从一秒到一分钟,由网页上的按钮调用,我有一个计时器,它调用同一服务中的另一个方法,最终将返回异步操作的状态(工作与否)。
所以我设置了一个虚拟示例,我的异步操作实际上阻塞了我的 Web 服务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | [ServiceContract(Namespace ="")] [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] public class Service1 { [OperationContract(AsyncPattern = true, Action ="TestServiceMethod", Name ="TestServiceMethod", ReplyAction ="TestServiceMethodReply")] public IAsyncResult BeginTestServiceMethod(string request, AsyncCallback callback, object asyncState) { var task = new Task<string>((state) => { SpinWait.SpinUntil(() => { return false; }, 5000); return request; }, asyncState); task.ContinueWith((t) => { callback(t); }); task.Start(); return task; } public string EndTestServiceMethod(IAsyncResult result) { var task = (Task<string>)result; return task.Result; } [OperationContract] public string OtherTest() { return"OtherTest"; } } |
这是我页面上的javascript(点击功能通过点击按钮激活)
1 2 3 4 5 6 7 8 9 | function Click() { var service = new Service1(); service.TestServiceMethod("Dummy", PopWord); service.OtherTest(PopWord); } function PopWord(word) { alert(word); } |
当我点击按钮时,结果是等待 5 秒,然后"Dummy"和"OtherTest"一个接一个地弹出。预期的行为将是"OtherTest"在 5 秒后弹出"Dummy"。
谁能发现我做错了什么或者建议另一种方法?
我猜你是在 cassini(开发服务器)而不是 IIS 上运行?
如果是这样,我见过不少人说cassini不能并行执行请求。
我似乎无法从 microsoft 找到任何关于此的文档,但有很多关于堆栈溢出的帖子,类似于以下内容。
ASP.NET 开发服务器并发处理不起作用
ASP.NET 开发服务器 (Cassini)、IIS Express 和多线程