ASP.NetアプリケーションにGeneric HTTP Handler(* .ashx)があります。このAPIは基本的ではあるが時間のかかる計算を実行します。 。これらの計算を実行するには、ハンドラによってロックされているデータファイルを読み込む必要があります。ハンドラへの2つの呼び出しが同時に処理を開始しないことが重要です。HTTPハンドラへの同時リクエストが機能しない
これを達成するために、計算が進行中であることを示す変数をキャッシュに追加しました。これにより、別のユーザーがすでに存在する場合にメインアプリケーションがユーザーをこのHandlerに送信できなくなります。 Handler自体では、Cache変数が設定されているかどうかをチェックし、Cache値が設定されている場合はメインアプリケーションに戻す必要があります。しかし、ハンドラーに2回アクセスすることでこれをテストすると、1回のアクセスは正常に実行され、2回目のアクセスはそこにあり、実行時に最初の処理が終了するまで何もしません。 IsReusableをtrueに設定することで違いはありません。
誰もがこのようなことが起こる理由を知りましたか?以下
コード:両方のスレッドが1前にキャッシュ値INPROGRESSを読めば
public partial class FAH : System.Web.UI.MasterPage
{
private Statistics _stats;
protected void Page_Init(object sender, EventArgs e)
{
this._stats = new Statistics(this.Server);
if (this._stats.StatsUpdateNeeded)
{
//If the Cache variable is set we're already updating
Object inprogress = Cache[UpdateStats.UpdateInProgressCacheKey];
if (inprogress != null) this.Response.Redirect("UpdateStats.ashx");
}
}
//etc...
}
に私はそれが起こることができると思いますが、更新がない場合ので、それが唯一とにかくバックハンドラに要求をリダイレクトするメインアプリケーションにつながりますメインアプリケーションはまだ更新が必要です。 – RobV
ヌルキャッシュで両方のスレッドを持つと、context.Cache.Insertを2回ヒットする可能性があるので、2回目のリクエストをブロックできません。しかし、これはあなたが記述している問題ではありません。 "if(inprogress!= null)this.Response.Redirect(" UpdateStats.ashx ");"という行にも同様のタイミング問題があります。これはハンドラにリダイレクトするためにブラウザに往復する必要があるためです。 どのように2つのテストリクエストを作成していますか?それは同じブラウザにありますか? –