正在重写延续状态存储/还原算法

本文关键字:还原 算法 存储 状态 重写 延续 | 更新日期: 2023-09-27 18:10:12

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

我想写这样的东西:

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

我希望开发人员能够在服务器上编写这些代码。正如您猜测的那样,p.Show()在HttpResponse中编写html代码,显示带有表单的页面,并将响应发送到客户端,因此,线程是killed并且我从未到达下一个指令(FormResponse response =(。

所以我的问题是:有什么办法做这样的事吗?我知道wait剪切代码,将其打包为一个延续,为我们制作闭包,并将其存储在某个地方,以便在p.Show((完成后调用它。但在这里,线程将被杀死,而这是我的代码,它从必须处理它的页面收到提交响应。所以我必须恢复"等待"创建的延续并自己执行它。

我是兴奋还是有可能?

编辑:附加信息

我可以再解释一点,但我们需要一个例子。假设您想对Web服务进行异步调用,只需使用wait,然后调用Web。Web不显示任何页面,它返回信息,您可以继续执行下一步的说明,因此对于Web,我们有:客户端->服务器A[-callwebs->Server B->]服务器A->Client。

现在,假设一个web必须显示一个用户界面来从用户那里获取一些信息,我们可以将这种web称为UIweb(一个由几个web应用程序调用的可重用接口(,它显示ui,获取信息,并将其发送回调用者。

因此,对于UI Web,我们有:Client->Server a[-response_redirect->Client-get->Server B(这是UI Web,客户端输入任何内容(-reresponse_reddirect->Client-get->]Server a->Client

我放在括号里的东西必须由开发者处理:

因此,对于经典的web,我可以想象异步页面正在"休眠",等待web响应,但对于UI web,我们必须响应并重定向到客户端,因此该页面是为asp.net完成的,SynchronizationContext表示没有更多的异步指令可等待。

事实上,我在这里的需要与打开web服务器并向其发送请求相同,该请求可以在等待之后恢复执行代码所需的一切。

谨致问候,朱利安

正在重写延续状态存储/还原算法

我不确定问题出在哪里。

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

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

如果您正在运行自己的主机(即不使用ASP.NET(,则必须实现SynchronizationContext。这不是小事,但也不是很难。一旦完成,asyncawait将"正常工作"。:(

响应编辑的更新答案:

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

如果我正确理解你的情况,你希望web服务返回一个UI,然后对它做出响应。这是HTTP工作方式的颠倒,所以你必须对viewstate做一些有趣的事情。我会考虑一下…