1

Web ページ index.aspx と対応するサーバー側コード index.aspx.cs があります。この C# コードには、複数のクライアントが Web サイトに接続している場合、並行して実行できないメソッドがあります。どうすればこれを制限できますか?

メソッドの機能は次のとおりです。フォルダーを作成し、それを圧縮して、ユーザーがダウンロードできるようにします。私の要件は、あるユーザーがこのメソッドを実行しているときに、他のユーザーがこれを実行しないようにすることです。これは、データの破損につながる同じフォルダーを再度作成するためです。

Session オブジェクトを使ってみました。しかし、セッション オブジェクトはクライアントごとに保存されることがわかりました。

誰かが私にいくつかの解決策を提案できますか?

4

3 に答える 3

1

Application コンテキストまたは静的クラスはアプリケーション全体です。したがって、プロセスがすでに開始されていることを示すフラグを保存できます。手続きが終了したら、フラグを削除できます。

http://msdn.microsoft.com/en-us/library/94xkskdf(v=vs.100).aspx

Application.Lockまた、アプリケーションの状態に書き込むlock(mutex)ときと、静的クラスを使用するときに常に使用します。

あなたの場合、アプリケーションコンテキストは従来のaspとの互換性のある目的のためにのみ存在するように見えるため、静的クラスがより良い解決策になるでしょう: ASP.NETでアプリケーション状態の代わりに静的変数を使用する

static object mutex= new object();

lock(mutex)
{
   //Do the work
}
于 2013-05-09T10:30:56.750 に答える
1

私の当面のアドバイスは、リクエストごとにランダムなフォルダー名を作成することです。これにより、それらを同時に実行できます。ただし、それができない場合は、lockまたはなどを使用して同期する必要がありますMutex。ただし、これは、あるリクエストで結果を圧縮して次のリクエストでダウンロードさせるのではなく、現在のリクエストから結果を返す場合にのみうまく機能します。

率直に言って、zipのリクエストでzip を実行する必要があると思います。実際、ファイルが巨大にならない限り、ファイル システムに触れる必要さえありません。MemoryStream任意の zip エンコーダーを使用してメモリ内に zip を作成できます (System.IO.Packaging.ZipPackageたとえば)。MemoryStream.

MVC を使用している場合、これは単なるreturn File(contents, contentType). 通常の ASP.NET では、さらにいくつかの手順が必要です。

于 2013-05-09T10:32:44.453 に答える
0

従来の asp.net セッションを使用する場合は、何もする必要はありません。セッションはすべて、複数のユーザーからのページの実行をロックする準備ができているためです。

そうでない場合は、マークの提案に従って、 を使用できますMutex

セッション ロックについて:
同じセッションを共有する別の Web アプリの処理中に Web アプリがブロックさ
れる Web サービスへの jQuery Ajax 呼び出しが同期しているように見える
ASP.NET サーバーがページを非同期的に処理しない
ASP.Net のセッションを完全に置き換える

于 2013-05-09T10:36:31.023 に答える