Page.AsyncTimeout - 无限超时?

时间:2014-05-01 08:10:58

标签: asp.net asynchronous c#-5.0 asp.net-4.5

我看到了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正在做这项工作,但是,它并不妨碍学习其他方面的工作。

1 个答案:

答案 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" %>

希望它有所帮助。