1

別のスレッドで関数を実行する非同期ページをasp.netに書き込もうとしています。次のコードの問題は、デバッグすると、関数EndAsyncOperationが呼び出されないことです。その結果、ページが完全に読み込まれず、永久に読み込まれます。アクションを使用して、スレッドプールとは別のスレッドでコードを実行します。動作する別のスレッドでコードを実行する別の方法はありますか?

どこが間違っているのですか?

そして別の質問。ASP .Netでは、ページがスレッドプールで実行されていることを読みました。では、サイトをデバッグして数ページを一緒にロードしようとすると、同期して次々にロードされるのでしょうか。

public partial class AsyncPage : System.Web.UI.Page
{
    void Page_Load(object sender, EventArgs e)
    {
        AddOnPreRenderCompleteAsync(
            new BeginEventHandler(BeginAsyncOperation),
            new EndEventHandler(EndAsyncOperation)
        );
    }

    IAsyncResult BeginAsyncOperation(object sender, EventArgs e,
        AsyncCallback cb, object state)
    {
        Action action = () =>
            {
                Start();
            };

        IAsyncResult asyncResult = action.BeginInvoke(new AsyncCallback(action.EndInvoke), null);

        return asyncResult;
    }

    void EndAsyncOperation(IAsyncResult ar)
    {
        // This function isn't reached
    }

    public void Start()
    {
        // Do something
    }
}
4

1 に答える 1

1

BeginAsyncOperationメソッドのパラメーターで提供されたAsyncCallbackオブジェクトを、新しいオブジェクトを作成するのではなく、BeginInvokeに渡す必要があると思います。

セッション構成が原因で、ページが同期的に読み込まれています。

ASP.NETセッション状態へのアクセスはセッションごとに排他的です。つまり、2人の異なるユーザーが同時に要求を行うと、別々の各セッションへのアクセスが同時に許可されます。ただし、(同じSessionID値を使用して)同じセッションに対して2つの同時要求が行われた場合、最初の要求はセッション情報への排他的アクセスを取得します。2番目の要求は、最初の要求が終了した後にのみ実行されます。(最初の要求がロックタイムアウトを超えたために情報の排他ロックが解放された場合も、2番目のセッションにアクセスできます。)@ PageディレクティブのEnableSessionState値がReadOnlyに設定されている場合、読み取り専用の要求セッション情報によって、セッションデータが排他的にロックされることはありません。ただし、セッションデータの読み取り専用要求は、セッションデータの読み取り/書き込み要求によって設定されたロックがクリアされるまで待機する必要がある場合があります。

出典:ASP.NETセッション状態の概要、私のハイライト。

于 2011-10-09T23:09:43.887 に答える