我的页面有一个相当长的任务,所以我在后台任务中运行它,因为我不希望它阻止任何回发事件。我们假设这段代码看起来像这样
Task task = new Task(() =>
{
for (;;)
{
Thread.Sleep(5000);
var x = (int)ViewState["progress"];
x++;
ViewState["progress"] = x;
}
});
task.Start();
如您所见,我将代码存储在ViewState
中。我在页面上有一个进度条以及一个每5秒钟一次的计时器来执行回发事件。在这种情况下,我正在更新进度条。代码看起来像这样。
protected void Timer1_Tick(object sender, EventArgs e)
{
int perc = (int)ViewState["progress"];
//Progress bar code here
}
进度条没有更新,所以我尝试了调试,出于某种原因,我在这两种情况下都得到了完全不同的值。计时器的事件一直给我0,但它似乎在循环中增加。它有两种不同的ViewState实例
我也尝试过锁定ViewState或使用全局变量,但没有运气。
答案 0 :(得分:0)
你所拥有的是灾难的秘诀。 Thead.Sleep
将暂停非常不受欢迎的帖子。
免责声明我不推荐这种技术!
您可以考虑使用稍好的
task = Task.Run(async () =>
{
for (var progress = 0; progress < 100; ++progress)
{
await Task.Delay(5000);
ViewState[nameof(progress)] = progress;
}
});
尽管如此,它仍然是灾难的秘诀。