[英]Locking a Web Form Thread in C#
我的Web主機允許我配置“計划任務”,該任務可用於計划HTTP請求到網頁以執行維護型任務。 我使用這些計划的任務來為我的網站執行每日計算。
問題在於,有時幾乎同時發出多個HTTP請求,導致計算記錄多次。 執行計算的方法會檢查當天尚未記錄相應的計算,但是HTTP請求的執行速度如此之快,以至於一個請求在另一個調用之前沒有完成。
這是我目前擁有的:
public partial class CalculateFOOADP : System.Web.UI.Page
{private System.Object lockThis = new System.Object();
protected void Page_Load(object sender, EventArgs e)
{
lock (lockThis)
{
if (SportSetting.Football.CalculateADP)
{
PerformFOOADPCalculations(SportSetting.Football.TimespanInDays);
}
}
}
private void PerformFOOADPCalculations(int timespanInDays)
{
string currentStatSeason = SportSeason.GetCurrentSportStatSeason(Globals.FOOString).SeasonCode;
string currentSeason = FOO.CurrentSeason;
/* we need to be sure that we're not double-logging ADP calculations */
// Quarterback ADP
if (ADPCalculation.GetADPCalculationCount(currentSeason, Globals.FOOString, FOOPositionsOffense.QB.ToString(), DateTime.Now.Date) == 0)
{
ADPManager.CalculateADP(Globals.FOOString, currentStatSeason, FOOPositionsOffense.QB.ToString(), timespanInDays);
}
// Running Back ADP
if (ADPCalculation.GetADPCalculationCount(currentSeason, Globals.FOOString, FOOPositionsOffense.RB.ToString(), DateTime.Now.Date) == 0)
{
ADPManager.CalculateADP(Globals.FOOString, currentStatSeason, FOOPositionsOffense.RB.ToString(), timespanInDays);
}
// Wide Receiver ADP
if (ADPCalculation.GetADPCalculationCount(currentSeason, Globals.FOOString, FOOPositionsOffense.WR.ToString(), DateTime.Now.Date) == 0)
{
ADPManager.CalculateADP(Globals.FOOString, currentStatSeason, FOOPositionsOffense.WR.ToString(), timespanInDays);
}
// Tight End ADP
if (ADPCalculation.GetADPCalculationCount(currentSeason, Globals.FOOString, FOOPositionsOffense.TE.ToString(), DateTime.Now.Date) == 0)
{
ADPManager.CalculateADP(Globals.FOOString, currentStatSeason, FOOPositionsOffense.TE.ToString(), timespanInDays);
}
// Kicker ADP
if (ADPCalculation.GetADPCalculationCount(currentSeason, Globals.FOOString, FOOPositionsOffense.K.ToString(), DateTime.Now.Date) == 0)
{
ADPManager.CalculateADP(Globals.FOOString, currentStatSeason, FOOPositionsOffense.K.ToString(), timespanInDays);
}
// Defense ADP
if (ADPCalculation.GetADPCalculationCount(currentSeason, Globals.FOOString, FOOPositionsOffense.DF.ToString(), DateTime.Now.Date) == 0)
{
ADPManager.CalculateADP(Globals.FOOString, currentStatSeason, FOOPositionsOffense.DF.ToString(), timespanInDays);
}
}
}
由於每個請求都有一個新的頁面實例,因此無法阻止跨頁面請求執行該方法。 不幸的是,最好的解決方案是安排另一個任務在一段時間后執行,這將刪除重復項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.