2

当我看到第一个关于 await 的消息时,我非常兴奋,我想了很多方法来使用它。其中之一是在我的 Web 框架中使用它来隐藏客户端/服务器交换的异步方面,就像它在几个框架中所做的那样。所以这里是交易:

我想写这样的东西:

{   
    Page p = new Page();
    FormResponse response = await p.Show();
    var field1 = reponse.inputField["input1"];
    ...
}

我希望开发人员能够在服务器上编写此代码。正如您猜测p.Show()的那样,在 HttpResponse 中写入显示带有表单的页面的 html 代码,并将响应发送到客户端,因此,线程被终止,我永远不会到达下一条指令(FormResponse response =)。

所以这是我的问题:有没有办法做这样的事情?我知道 await 剪切代码,将其打包,为我们关闭,并将其存储在某个地方以便在 p.Show() 完成时将其回调。但是在这里,线程将被杀死,这是我的代码,它接收来自 Page 的提交响应,它必须处理它。所以我必须恢复“等待”创建的延续并自己执行它。

我变高了还是有可能?

编辑:附加信息

我可以多解释一点,但我们需要一个例子。想象一下,您想对 web 服务进行异步调用,您只需使用 await 然后调用 web。网络不显示任何页面,它返回信息片段,您可以继续下一个指令,因此对于网络,我们有:客户端 -> 服务器 A [-callwebs-> 服务器 B ->] 服务器 A -> 客户端。

现在,想象一个必须显示用户界面以从用户那里获取一些信息的网络,我们可以将这种网络称为 UIwebs(由多个 webapp 调用的可重用界面),它显示 ui,获取信息,然后发送它返回给调用者。

因此,对于 UI 网络,我们有:客户端 -> 服务器 A [-response_redirect-> 客户端 -get-> 服务器 B(这里是 UIweb,客户端输入任何内容)-response_redirect-> 客户端 -get-> ] 服务器 A ->客户

我放在括号中的内容必须由开发人员处理:

所以对于经典的网络,我可以想象异步页面正在“休眠”等待网络响应,但是对于 UI 网络,我们必须响应并重定向到客户端,所以页面是为 asp.net 完成的,SynchronizationContext 说没有更多的异步指令等待。

事实上,我在这里的需要就像打开 Web 服务器,并向它发送一个请求,以便在等待之后恢复执行代码所需的一切。

问候,朱利安

4

1 回答 1

0

我不确定问题是什么。

例如,如果您有 ASP.NET 异步页面,那么任何顶级 ( async void) 函数都会正确通知 ASP.NET 该页面不完整并释放线程。稍后,延续将在(可能是另一个)线程上运行,恢复请求上下文并完成请求。

async设计经过精心设计,以实现这种精确的行为。特别是,如我在最近的 MSDN 文章中async void所述,增加未完成的异步操作计数。SynchronizationContext

如果您正在运行自己的主机(即,不使用 ASP.NET),那么您必须实现SynchronizationContext. 这不是微不足道的,但也不是非常困难。一旦完成,async它将await“正常工作”。:)

更新答案以响应编辑:

请记住,await/async只是语法糖;他们没有实现以前不可能的任何事情——他们只是让事情变得更容易。

如果我正确理解您的情况,您希望 Web 服务返回 UI,然后对其进行响应。这是 HTTP 工作方式的反转,因此您必须使用视图状态做一些时髦的事情。我会考虑一下...

于 2011-09-30T16:09:03.317 回答