[英]Stop action that takes a long time timing out load balancer
我正在嘗試找到一種發送電子郵件操作的解決方案,該解決方案可能會花費很長時間,並且會使Rackspace上的負載均衡器超時。 我能找到的與此特定問題有關的唯一問題是:
據我了解,我需要在主要的慢速動作完成后繼續執行另一項操作,以不斷輪詢並返回,以保持活動狀態。 我的電子郵件操作包含以下內容:
var sendto = db.Users
.Where(b => b.Id == model.SentTo |
((model.SelectedRoles.Any(s => b.Roles.Select(h => h.RoleId).Contains(s)))
&& ((b.enrollment.Any(h => h.cohort.CourseID == model.CourseID) | model.CourseID == null))
&& (b.OrgID == model.OrgID | model.OrgID == null))).ToList();
foreach (var address in sendto)
{
string Body = "message goes here";
EmailConfig.SendMessageViaMailGun(filestoattach, address.Email, null, email.Subject, Body);
}
因此,創建了一個列表,然后遍歷整個列表,並向列表中的每個人發送電子郵件。 上面問題中的Async方法答案似乎可以解決問題,但在注釋中我可以看到這被認為是一個壞主意。 就最新MVC版本中異步的工作方式而言,它也已過時。
我的問題是,防止此操作在完成負載均衡器時使其超時的最佳方法是什么?
這實際上與異步無關,這是一個基礎結構問題。
有兩種執行長時間操作的方法:
正確的方法:讓后端服務器和在其中運行的進程+通過排隊(或數據庫輪詢)與該后端進程通信,然后客戶端根據進度更新(存儲在某些數據庫中)並更新Web服務器上的UI。 您還需要跟蹤后端的進度,以在意外關閉的情況下繼續操作。
便宜的方法:在Web服務器上旋轉一個不同的線程(或任務),並讓它執行操作,然后從javascript中輪詢該線程的進度。 但是,這有可能在任何時候關閉(Web服務器回收),並且您丟失了該操作(如果可以的話),那么您需要進行該操作並繼續。 一種粗略的方法是使用Task.Run包裝您擁有的所有東西,然后立即返回,然后從Javascript查詢進度,但是正如我上面所說的那樣,這很容易出現中斷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.