当我看到有关等待的第一个新闻时,我非常兴奋,我想到了很多使用它的方法。 其中之一是在我的Web框架中使用它来隐藏客户端/服务器交换的异步方面,就像它在几个框架中完成的那样。 所以这是交易:
我想写这样的东西:
{
Page p = new Page();
FormResponse response = await p.Show();
var field1 = reponse.inputField["input1"];
...
}
我希望开发人员能够在服务器上编写此代码。正如您猜测p.Show()
在HttpResponse中写入显示带有表单的页面的html代码,并将响应发送给客户端,因此,线程是
被杀了,我从未到达下一条指令(FormResponse response =
)。
所以这是我的问题: 有没有办法做这样的事情?我知道等待切割代码,将其打包为延续,为我们制作封闭,并在p.Show()完成时将其存储在某处以便回调。 但是在这里,线程将被杀死,这是我的代码,它接收来自Page的提交响应,必须处理它。所以我必须恢复“等待”创建的继续并自己执行它。
我变高还是可能?
编辑:其他信息
我可以解释一下,但我们需要一个例子。 想象一下,您想要对Web服务进行异步调用,只需使用等待然后调用Web即可。 网站不会显示任何页面,它会返回信息,您可以继续下一个说明,因此我们拥有网站:客户端 - >服务器A [-callwebs->服务器B - >]服务器A - >客户。
现在,假设一个网站必须显示用户界面以从用户那里获取一些信息,我们可以将这种网络称为UIwebs(一个由几个webapp调用的可重用接口), 它显示ui,抓取信息,然后将其发送回呼叫者。
因此,通过UI网络,我们拥有:客户端 - >服务器A [-response_redirect->客户-get->服务器B(这里是UIwebs,客户端输入什么)-response_redirect->客户-get-> ]服务器A - >客户端
我在括号之间放置的内容必须由开发人员处理:
所以对于经典的网页,我可以想象异步页面正在“休眠”等待网站响应,但是有了一个UI网页我们必须响应à重定向到客户端,所以页面是为asp.net完成的,和SynchronizationContext说没有更多的异步指令可以等待。
事实上,我的需求与打开网络服务器相同,并向其发送请求,以便在等待之后恢复执行代码所需的一切。
此致 于连
答案 0 :(得分:0)
我不确定问题是什么。
如果你有例如ASP.NET异步页面,那么任何顶级(async void
)函数都会正确地通知ASP.NET该页面不完整并释放该线程。稍后,继续将在(可能是另一个)线程上运行,恢复请求上下文,并完成请求。
小心地完成了async
设计,以实现这种确切的行为。特别是,async void
增加SynchronizationContext
中未完成的异步操作计数,正如我所描述的in a recent MSDN article。
如果您正在运行自己的主机(即不使用ASP.NET),那么您必须实现SynchronizationContext
。这也是非平凡的,但也不是很难。完成此操作后,async
和await
将“正常工作”。 :)
为响应修改而更新了答案:
请记住,await
/ async
只是语法糖;他们没有启用以前不可能的任何东西 - 他们只是让它变得更容易。
如果我正确了解您的情况,您希望Web服务返回UI然后对其进行响应。这是对HTTP工作方式的反转,因此您必须使用viewstate做一些时髦的东西。我会考虑一下......