我有一個 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(字符串)列表。然后讓一個單獨的工作進程從該隊列中讀取并執行實際工作。最后,“等待”頁面應該進行輪詢,直到請求全部完成。
- 1 回答
- 0 關注
- 98 瀏覽
添加回答
舉報
0/150
提交
取消