У меня есть приложение для веб-форм. На одной форме у меня есть несколько функций. Они называются синхронно и требуют некоторого времени. Поэтому мне нужно вызвать их в разных потоках.
Вот пример того, что я делаю:
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. Это делает вещи намного проще и предсказуемо