Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 覆盖连续状态存储/恢复算法?_C#_Async Await - Fatal编程技术网

C# 覆盖连续状态存储/恢复算法?

C# 覆盖连续状态存储/恢复算法?,c#,async-await,C#,Async Await,当我看到关于await的第一条新闻时,我非常激动,我想到了很多使用它的方法。 其中之一是在我的web框架中使用它来隐藏客户端/服务器交换的异步方面,就像在几个框架中一样。 这就是交易: 我想这样写: { Page p = new Page(); FormResponse response = await p.Show(); var field1 = reponse.inputField["input1"]; ... } 我希望开发人员能够在服务器上编写此代

当我看到关于await的第一条新闻时,我非常激动,我想到了很多使用它的方法。 其中之一是在我的web框架中使用它来隐藏客户端/服务器交换的异步方面,就像在几个框架中一样。 这就是交易:

我想这样写:

{   
    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进行一些有趣的操作。我会考虑的