簡體   English   中英

在C#中鎖定Web表單線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM