2014-05-05 81 views
1

我的网络主机允许我配置'计划任务',它可以用来为进行维护类型任务的网页安排HTTP请求。我使用这些计划任务来为我的网站执行每日计算。在C#中锁定Web窗体线程#

问题是,有时多个HTTP请求几乎同时进行,导致计算被记录多次。执行计算的方法会检查相应的计算是否在当天没有记录,但是HTTP请求的速度太快以至于在请求另一个之前没有完成。

这是我目前有:

public partial class CalculateFOOADP : System.Web.UI.Page 

{ 私人System.Object的lockThis =新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); 
    } 
} 

}

+3

每个请求都会获得一个新的页面实例。你需要一个静态字段。但是,请注意多个应用程序域。 – SLaks

回答

0

由于这样的事实,每个请求获得一个新的页面实例,有没有办法阻止整个页面请求的方法的执行。不幸的是,最好的解决方案是安排另一个任务在一段时间后发生,这将删除重复项。