我看到了forever iframe
index.html
实施(彗星模拟)的an example,所以我决定测试它,但增加了异步方法,这样就不会有阻塞
非常简单:
我有一个隐藏iframe
的网页(AdminPush.aspx
),其SRC为 /*1*/ protected void Page_Load(object sender, EventArgs e)
/*2*/ {
/*3*/ UpdateMessage();
/*4*/ }
/*5*/
/*6*/
/*7*/ protected void UpdateMessage()
/*8*/ {
/*9*/ HttpContext.Current.Response.ContentType = "text/html";
/*10*/ Response.Write("<script >parent.UpdateMessage(DateTime.Now.Second)</script>");
/*11*/ Response.Flush();
/*12*/
/*13*/ //async part goes here !!
/*14*/ this.RegisterAsyncTask(new PageAsyncTask(async cancellationToken =>
/*15*/ {
/*16*/ await Task.Delay(2000, cancellationToken);
/*17*/ UpdateMessage();
/*18*/ }));
/*19*/ }
:
AdminPush.aspx
在我添加的Async="true"
页面上:
index.html
在html页面(function UpdateMessage(Message)
{
console.log(Message);
}
function setupAjax() //body Onload - calls it.
{
var iframe = document.createElement("iframe");
iframe.src = "adminpush.aspx";
iframe.style.display = "none";
document.body.appendChild(iframe);
}
)上我添加了:
index.html
所以基本上iframe正在注入脚本命令,它会更新iframe的父AsyncTimeOut
。
它正在发挥作用。
但是当我测试它时 - 它在45秒后停止更新。
我认为它与web.config中的requestTimeout prop有关 - 但它不是。
它与AdminPush.aspx
页面中缺少的sum(all async operations)
道具有关。
问题#1:
根据msdn AsyncTimeout:
获取或设置一个值,该值指示使用时的超时间隔 处理异步任务。
但它也说:
TimeSpan,包含完成的允许时间间隔 异步任务。默认时间间隔为45秒。
请注意我每次“延迟”2秒
首先我将超时设置为1分钟,但之后也失败了。我认为超时应该是关于每次操作,而不是关于sum(tasks)
为什么会那样?它假设异步任务超时! (单个)但它的行为为{{1}}
这里的措辞具有误导性。任何澄清?
问题#2:
我需要将其设置为 max 值。 是什么价值?但是,我需要它,所以支持浏览器很长一段时间。所以我担心这个值也无济于事。
有什么方法可以重置这个值(n个周期后)?
我知道还有其他解决方案/库,比如signalR正在做这项工作,但是,它并不妨碍学习其他方面的工作。
答案 0 :(得分:1)
异步页面的想法是释放IIS,这样就可以为更多的用户提供服务,如果你创建一个“永远不会”的页面。完成后,你将耗尽所有资源。
有人说过......如果你还想这样做......
我们知道&#34; (文档),异步页面的工作方式是将页面的执行分成2个...后台任务之前的所有内容以及任务之后的所有内容,这样IIS可以在后台任务完成工作时处理更多请求。 (还有更多内容,但现在已足够了)
所以...他们 &#34;必须&#34; 创建某种任务管理器(如root / main任务)按顺序执行所有已注册的任务,这样IIS开始处理页面,启动任务管理器,释放IIS,任务管理器继续处理任务,当它完成时,它将控制返回给IIS。
这可以解释为什么AsyncTimeout控制所有已注册的任务而不是一个一个(超时实际上应用于任务管理器)。
我测试了你的代码的变体,超时为6000秒,它可以工作:
C#:
protected void Page_Load(object sender, EventArgs e)
{
Page.RegisterAsyncTask(new PageAsyncTask(ProcessTask));
}
protected async Task ProcessTask()
{
await Task.Delay(1000);
Response.Write(DateTime.Now.ToLongTimeString() + "<br/>");
Response.Flush();
Page.RegisterAsyncTask(new PageAsyncTask(ProcessTask));
}
ASPX:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Sample03.Default" Async="true" AsyncTimeout="6000" %>
希望它有所帮助。