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);
}
}
}
每个请求都会获得一个新的页面实例。你需要一个静态字段。但是,请注意多个应用程序域。 – SLaks