为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在添加任务时会创建列表的新实例?

为什么在添加任务时会创建列表的新实例?

C#
芜湖不芜 2022-12-24 14:11:58
我有一个 asp.net 应用程序,用户可以在其中按下按钮来启动长时间运行的操作,并且可以多次这样做。每次他们这样做时,我都想将创建的任务添加到列表中,以便稍后,当他们想要进入下一页时,该页面会等待列表中的所有任务完成后再重定向。我有以下结构:private List<Task> tasks = new List<Task>();private SemaphoreSlim mutex = new SemaphoreSlim(1, 1);// Simulate some workprivate async Task MyWork(){    int t = 0;    while (t < 5)    {        await Task.Delay(TimeSpan.FromSeconds(5));        t ++;    }}// Called in the button's eventhandlerpublic void DoWork(){    mutex.Wait();    this.tasks.Add(Task.Run(() => MyWork());    mutex.Release();}调试时我发现每次 DoWork 访问任务列表时,当任务被添加到列表时列表是空的,似乎每次都创建一个单独的列表实例。另外,当我稍后以另一种方法访问该列表时,该列表在那里是空的。为什么会发生这种情况,而不是将每个任务都添加到同一个列表实例中?
查看完整描述

1 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

当 ASP.NET 收到新请求时,它会创建页面的新实例。这就是您总是看到空列表的原因。

应该做的是让您的按钮处理程序创建一个请求 ID(例如,Guid),将该请求插入可靠队列,然后使用该请求 ID 更新会话状态。因此,您拥有的不是任务列表,而是请求 ID(字符串)列表。然后让一个单独的工作进程从该队列中读取并执行实际工作。最后,“等待”页面应该进行轮询,直到请求全部完成。


查看完整回答
反对 回复 2022-12-24
  • 1 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信