当在asp.net中使用System.Timers.Timer时,响应在此上下文中不可用
我试图在计时器过去时将用户重定向到其他页面。我的代码运行,但我得到这个错误在这条线当在asp.net中使用System.Timers.Timer时,响应在此上下文中不可用
Page.Response.Redirect(myUri, false);
我的代码看起来像这样
void dataSyncCheck_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
Page.Response.Redirect(myUri, false);
}
var tasks = new Task[2]
{
Task.Factory.StartNew(() => {
//Process Data
}),
Task.Factory.StartNew(() => {
//Sleep while not sync.
})
};
Task.WaitAll(tasks);
Page.Response
客户端完成页面加载后不存在。因此不能用于事后重定向。
您可以执行上述操作并强制页面加载在向客户端返回响应之前等待“同步检查”完成,或者您可以使用客户端ajax请求在服务器之后向服务器请求状态更新页面加载实质上将定时器从服务器移动到客户端。
此代码与我的问题相同。我没有任何地方可以把WaitAll(任务),等我等待后,我可以重定向页面myUri没有响应是不可用的错误。 – codemonkeyliketab
我认为你的问题的直接答案是一旦加载了初始页面,服务器端就不能完成 - 即响应被发送到客户端,并且服务器端代码不在图片,直到下一个请求。这就是网络的性质。
我的建议是将此功能移到客户端。您需要一个XmlHttpRequest
(XHR,aka AJAX)调用服务器(想想API调用,仅针对您自己的服务器),根据您的特定规则/逻辑确定是否需要重定向。对这种XHR调用的响应可以像布尔一样简单,也可以包含重定向的URL。
如果你想利用内置的WebForms设施优势来处理客户端的重定向,您可以用Web.UI.Timer
而是用ScriptManager
控制沿:
在ASPX代码:
<asp:ScriptManager ID="scriptManager" runat="server"></asp:ScriptManager>
<asp:Timer runat="server" ID="redirectTimer" Interval="5000" OnTick="redirectTimer_Tick" Enabled="true" />
在后台代码:
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
//Handle initial page load
}
}
protected void redirectTimer_Tick(object sender, EventArgs e)
{
if(someConditionIsSatisfied)
{
Response.Redirect(myUri, false);
}
}
请记住,在Timer.Tick
事件在上面的代码会导致完全-b后ack - 即,您的页面将完全重新加载。您可以使用其他机制(如更新面板)来“隐藏”来自客户端的重新加载,但您的Page_Load()
事件处理程序中的任何代码都将在每个计时器tick上运行;请注意这一点。 您可以通过检查Page.IsPostBack
属性来确保您的Page_Load()
代码只执行一次。底线,你试图在错误的上下文中完成你的任务 - 这是一个客户端,而不是服务器,处理的工作。
我想你和我说的是一样的东西,不是吗? –
@Max Sorin,就客户端重定向来处理这项工作而言,是的。尽管我没有完全按照你对任务的建议 - 你是否不得不延迟对客户的回应(意思是,延迟回应直到达到所需的状态)才能起作用? – CoolBots
是的,就是这个想法......我的意思是,尽我所能,他正在努力实现这一目标。 –
为定时器和主体请求线程启动了一个新线程,该线程不能访问定义了“Page.Response”实例的线程。 –
@MaxSorin如何在原始线程上执行代码? – codemonkeyliketab
如果您想在几秒钟后自动重定向浏览器,则需要使用JavaScript而不是在服务器上执行此操作! –