我有一個 asp.net 應(yīng)用程序,用戶可以在其中按下按鈕來啟動長時間運行的操作,并且可以多次這樣做。每次他們這樣做時,我都想將創(chuàng)建的任務(wù)添加到列表中,以便稍后,當(dāng)他們想要進入下一頁時,該頁面會等待列表中的所有任務(wù)完成后再重定向。我有以下結(jié)構(gòu):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();}調(diào)試時我發(fā)現(xiàn)每次 DoWork 訪問任務(wù)列表時,當(dāng)任務(wù)被添加到列表時列表是空的,似乎每次都創(chuàng)建一個單獨的列表實例。另外,當(dāng)我稍后以另一種方法訪問該列表時,該列表在那里是空的。為什么會發(fā)生這種情況,而不是將每個任務(wù)都添加到同一個列表實例中?
1 回答

慕的地10843
TA貢獻1785條經(jīng)驗 獲得超8個贊
當(dāng) ASP.NET 收到新請求時,它會創(chuàng)建頁面的新實例。這就是您總是看到空列表的原因。
您應(yīng)該做的是讓您的按鈕處理程序創(chuàng)建一個請求 ID(例如,Guid),將該請求插入可靠隊列,然后使用該請求 ID 更新會話狀態(tài)。因此,您擁有的不是任務(wù)列表,而是請求 ID(字符串)列表。然后讓一個單獨的工作進程從該隊列中讀取并執(zhí)行實際工作。最后,“等待”頁面應(yīng)該進行輪詢,直到請求全部完成。
- 1 回答
- 0 關(guān)注
- 108 瀏覽
添加回答
舉報
0/150
提交
取消