C# 覆盖连续状态存储/恢复算法?
当我看到关于await的第一条新闻时,我非常激动,我想到了很多使用它的方法。 其中之一是在我的web框架中使用它来隐藏客户端/服务器交换的异步方面,就像在几个框架中一样。 这就是交易: 我想这样写:C# 覆盖连续状态存储/恢复算法?,c#,async-await,C#,Async Await,当我看到关于await的第一条新闻时,我非常激动,我想到了很多使用它的方法。 其中之一是在我的web框架中使用它来隐藏客户端/服务器交换的异步方面,就像在几个框架中一样。 这就是交易: 我想这样写: { Page p = new Page(); FormResponse response = await p.Show(); var field1 = reponse.inputField["input1"]; ... } 我希望开发人员能够在服务器上编写此代
{
Page p = new Page();
FormResponse response = await p.Show();
var field1 = reponse.inputField["input1"];
...
}
我希望开发人员能够在服务器上编写此代码。正如您猜测的那样,p.Show()
在HttpResponse中编写html代码,用表单显示页面,并将响应发送给客户端,因此,线程是
已终止,我永远无法到达下一条指令(FormResponse=
)
所以我的问题是:
有没有办法做这样的事?我知道wait会剪切代码,将其打包成一个续集,为我们完成闭包,并将其存储在某个地方,以便在p.Show()完成后调用它。
但是在这里,线程将被终止,这是我的代码,它接收来自页面的提交响应,页面必须处理它。因此,我必须恢复“等待”创建的延续,并亲自执行它
我是越来越兴奋还是有可能
编辑:附加信息
我可以再解释一点,但我们需要一个例子。
假设您要对Web服务进行异步调用,只需使用wait,然后调用Web。
Web不显示任何页面,它返回一些信息,您可以继续下一步的说明,因此,对于Web,我们有:客户端->服务器A[-callwebs->服务器B->]服务器A->客户端
现在,假设一个Web必须显示一个用户界面才能从用户那里获取一些信息,我们可以将这种Web称为UIwebs(一个由多个webapp调用的可重用界面),
它显示ui,获取信息,并将其发送回调用方
因此,对于UI站点,我们有:客户机->服务器a[-response\u redirect->Client-get->serverB(这里是UIWeb,客户机输入任何内容)-response\u redirect->Client-get->]服务器a->Client
我放在括号之间的内容必须由开发人员处理:
因此,对于一个经典的Web,我可以想象异步页面正在“休眠”等待Web响应,但是对于UI Web,我们必须响应重定向到客户端,因此页面是为asp.net完成的,SynchronizationContext说没有更多的异步指令等待
事实上,我在这里的需求与打开web服务器,并向其发送一个请求相同,它可以在等待之后恢复执行代码所需的一切
问候,,
朱利安我不确定问题出在哪里 例如,如果您有ASP.NET异步页面,则任何顶级(
async void
)函数都会正确地通知ASP.NET页面不完整并释放线程。稍后,继续将在一个(可能是另一个)线程上运行,恢复请求上下文,并完成请求
async
设计是为了实现这种精确的行为而精心设计的。特别是,async void
增加了SynchronizationContext
中未完成的异步操作计数,如我所述
如果您正在运行自己的主机(即不使用ASP.NET),则必须实现SynchronizationContext
。这不是小事,但也不是很难。完成此操作后,async
和wait
将“正常工作”。)
更新了对编辑的响应:
请记住,await
/async
只是语法上的糖分;他们没有实现任何以前不可能实现的事情——他们只是让事情变得更容易
如果我正确理解您的情况,那么您希望web服务返回UI,然后对其作出响应。这与HTTP的工作原理相反,因此您必须对viewstate进行一些有趣的操作。我会考虑的…我不确定是什么问题 例如,如果您有ASP.NET异步页面,则任何顶级(
async void
)函数都会正确地通知ASP.NET页面不完整并释放线程。稍后,继续将在一个(可能是另一个)线程上运行,恢复请求上下文,并完成请求
async
设计是为了实现这种精确的行为而精心设计的。特别是,async void
增加了SynchronizationContext
中未完成的异步操作计数,如我所述
如果您正在运行自己的主机(即不使用ASP.NET),则必须实现SynchronizationContext
。这不是小事,但也不是很难。完成此操作后,async
和wait
将“正常工作”。)
更新了对编辑的响应:
请记住,await
/async
只是语法上的糖分;他们没有实现任何以前不可能实现的事情——他们只是让事情变得更容易
如果我正确理解您的情况,那么您希望web服务返回UI,然后对其作出响应。这与HTTP的工作原理相反,因此您必须对viewstate进行一些有趣的操作。我会考虑的