1

Webフォームアプリケーションがあります。1 つのフォームには、いくつかの機能があります。これは同期的に呼び出され、時間がかかります。したがって、それらを別のスレッドで呼び出す必要があります。

これは私がやっていることのサンプルです:

    protected void Page_Load(object sender, EventArgs e)
    {
        Thread t1 = new Thread(new ThreadStart(Function1));
        t1.Start();
        Thread t2 = new Thread(new ThreadStart(Function2));
        t2.Start();
    }

    private void Function1()
    {
        Thread.Sleep(5000);
        lbl1.Text = "Function1 completed";
    }

    private void Function2()
    {
        Thread.Sleep(5000);
        lbl2.Text = "Function2 completed";
    }

デバッグ (ブレークポイントを設定)lbl1.Text = "Function1 completed";lbl2.Text = "Function2 completed";て呼び出された場合、最終的な HTML ページでテキストが変更されません。

また、ページの読み込みに 5 秒もかかりません。

ps asp net の動作が異なることは知っていますが、何が間違っているのかわかりません。

4

3 に答える 3

8

ページがレンダリングされて返される前に、スレッドが完了するのを待っているものは何もありません。それが問題です。

関数の最後Page_Load()(またはページ レンダリング ライフサイクルの最新の可能な時点) に、次を追加します。

t1.Join();
t2.Join();

さらに、スレッド プロシージャ内で lbl1 と lbl2 を更新しないでください。結果を変数に格納し、計算された値をメイン レンダリング スレッドに反映する必要があります (つまり、一度Join返されます)。

編集:これで質問の問題は修正されますが、Vano の回答で推奨されているようにPageAsyncTaskをご覧ください。

于 2013-01-12T17:59:26.717 に答える
2

関数を非同期で実行する場合は、いくつかの手順を実行する必要があります。

1)。Async="true" ページ ディレクティブを設定する必要があります。

<%@ Page Language="C#" Async="true" ... %>

2)。PageAsyncTaskオブジェクトを作成し、 Page.RegisterAsyncTask()関数を使用して登録する必要があります。

RegisterAsyncTask 関数は関数を同期化コンテキストに登録するため、ASP.NET は関数を非同期的に実行し、登録されたすべての関数が完了するまで待機してから、ページ処理を続行します。

于 2013-01-12T18:01:09.400 に答える
0

新しいスレッドを開始しますが、それらが完了するのを待ちません。したがって、thread.start() はブロックされていないため、page_load は最後まで実行されます。

最新の .NET バージョンの async/wait をご覧ください。これにより、物事がはるかに簡単になり、予測可能になります

于 2013-01-12T18:02:32.373 に答える