Как использовать потоки в asp.net?

У меня есть приложение для веб-форм. На одной форме у меня есть несколько функций. Они называются синхронно и требуют некоторого времени. Поэтому мне нужно вызвать их в разных потоках.

Вот пример того, что я делаю:

    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";
    }

Если я отлаживаю (устанавливаю breackpoints) lbl1.Text = "Function1 completed"; и lbl2.Text = "Function2 completed"; получает вызов, но там тексты не изменяются на последней странице html.

Также загрузка страницы не занимает 5 секунд.

p.s. Я знаю, что asp net работает по-разному, но я понятия не имею, что я делаю неправильно.

Ответ 1

Ничто не ждет завершения ваших потоков до того, как страница будет отображена и возвращена - что не так.

В конце вашей функции Page_Load() (или в самой последней возможной точке жизненного цикла рендеринга страницы) добавьте:

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

Кроме того: вы не должны обновлять lbl1 и lbl2 в потоке proc - вы должны хранить результат в переменных и отражать вычисленные значения в основном потоке рендеринга (т.е. один раз Join вернулся).

Изменить: хотя это устраняет проблему в вопросе, посмотрите PageAsyncTask, как рекомендовано ответом Вано.

Ответ 2

Если вы хотите выполнять функции асинхронно, вам необходимо выполнить следующие действия:

1). вам нужно установить директиву страницы Async = "true".

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

2). Вам нужно создать объект PageAsyncTask и зарегистрировать его с помощью Page.RegisterAsyncTask( ).

Функция RegisterAsyncTask регистрирует вашу функцию в контексте синхронизации, поэтому ASP.NET будет запускать вашу функцию асинхронно, а также ждет завершения всей зарегистрированной функции, а затем продолжает обработку страниц.

Ответ 3

Вы запускаете новые потоки, но не ждете их завершения. Следовательно, ваш page_load завершается, так как thread.start() не блокирует.

Посмотрите на async/wait в последней версии .NET. Это делает вещи намного проще и предсказуемо