在页面和后台任务之间共享变量

时间:2017-02-27 11:59:16

标签: c# asp.net

我的页面有一个相当长的任务,所以我在后台任务中运行它,因为我不希望它阻止任何回发事件。我们假设这段代码看起来像这样

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或使用全局变量,但没有运气。

1 个答案:

答案 0 :(得分:0)

你所拥有的是灾难的秘诀。 Thead.Sleep将暂停非常不受欢迎的帖子。

免责声明我不推荐这种技术!

您可以考虑使用稍好的

task = Task.Run(async () =>
{
    for (var progress = 0; progress < 100; ++progress)
    {
        await Task.Delay(5000);
        ViewState[nameof(progress)] = progress;
    }
});

尽管如此,它仍然是灾难的秘诀。