4

ボタンをクリックするとダイアログを開くページがあり、ボタンをクリックすると開いたダイアログフォームで、選択した.txtファイルからデータのリストを読み取り、クエリを作成してデータをいくつかに追加できるシナリオがあります。データベーステーブル。大量のデータが存在する可能性があるため、このプロセスには長い時間がかかる可能性があります。これにより、ユーザーはアップロードが完了するまでアプリケーションで作業できなくなります。したがって、アップロードプロセスをAsynkにするために、PageAsyncTaskを使用しています。以下はコードサンプルですが、PageAsyncTaskで呼び出されるメソッドでは、HttpContext.Currentがnullであるため、セッション処理を使用できません。なぜこれがnullになるのか、この場合にセッションをどのように使用できるのかについてのガイダンスを教えてください

   protected void BtnUpload_click(object sender, EventArgs e)
    {
        PageAsyncTask asyncTask1 = new PageAsyncTask(OnBegin, OnEnd, OnTimeout, SessionManager.UserData, true);

        Page.RegisterAsyncTask(asyncTask1);
        Page.ExecuteRegisteredAsyncTasks();
    }

public IAsyncResult OnBegin(object sender, EventArgs e,
            AsyncCallback cb, object extraData)
    {
        _taskprogress = "AsyncTask started at: " + DateTime.Now + ". ";
        uData = extraData as UserData;

        _dlgt = new AsyncTaskDelegate(BeginInvokeUpload);
        IAsyncResult result = _dlgt.BeginInvoke(cb, extraData);

        return result;
    }

private void BeginInvokeUpload()
    {
        string selectedFileName = string.Empty;
        string returnValuePage = string.Empty;
        User teller = new User();
        SessionManager.UserData = uData;
    }



  private void BeginInvokeUpload()
    {
        string selectedFileName = string.Empty;
        string returnValuePage = string.Empty;
        User teller = new User();
        SessionManager.UserData = uData;
    }

public class SessionManager
    {
public static UserData UserData
        {
            get 
            {
                UserData userData = null;
                if (HttpContext.Current.Session["UserData"] != null)
                {
                    userData = HttpContext.Current.Session["UserData"] as UserData;                    
                }
                return userData;
            }
            set 
            {
                 HttpContext.Current.Session["UserData"]=value;                  
            }
        }
}
4

1 に答える 1

4

答えは簡単です。HttpContext.Current is null

したがって、セッションを変更する必要がある場合、単純にすることはできません。唯一の代替手段は、完全にカスタムのセッション モジュール/ソリューションを作成することです。

一部の値のみを読み取る必要がある場合は、スレッドを作成するときにそれらを渡すことができます。

最後に、唯一の解決策は、セッション変数の操作に勝った場合、スレッドを使用しないことです。

なぜこのデザイン?

MS セッションでは、ページの外側とスレッドの内側で処理できなかったのはなぜですか? 答えは、ページ処理でセッション データをロックする必要があるためです。このロックでは、スレッドを開始してセッション データを取得できたとしても、それを並行して使用することはできません。

また、スレッドで自分自身のセッションを使用できた場合、このスレッドはページ ビュー プロセス全体をロックする可能性があります。もう一度言いますが、セッションはページ ビュー全体をロックし、同じセッションを使用する各ページはそうではないからです。並行して作業する

このページ全体でのセッションのロックは、MS セッションの動作に必要であり、これを回避する唯一の方法は、完全にカスタムのセッション ソリューションを作成し、異なるコードで特殊なケースを処理することです。

その設計の良い点は、ページ呼び出しごとに自分で多くのロックと同期を行うことを避けることです。たとえば、ページでセッションを無効にし、そのページをデータ挿入に使用する場合、挿入をクリックし、挿入で同期を使用して処理しないと、複数の同じ挿入が発生します。

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

同様の質問:
SessionID を使用して、HttpContext.Current を使用せずにセッション データを取得する方法

于 2012-12-12T16:08:29.367 に答える