asp.net асинхронный поток с пулами - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть долгосрочное задание, которое мне нужно реализовать на веб-странице.То, что я хотел бы сделать, это запустить задачу в отдельном потоке, но иметь индикатор выполнения на веб-странице.

Я изо всех сил пытаюсь найти легкий способ сделать это.Вот очень упрощенный пример, на котором я хочу сделать это.По сути, я хочу, чтобы ResetAll () находился в потоке, и пул переменной y обновлял пользовательский интерфейс веб-страницы.

Может кто-нибудь мне помочь?

Protected Sub btnReset_Click(sender As Object, e As System.EventArgs) Handles btnResetLowConductor.Click
    ResetAll()
End Sub

Private Sub ResetAll()
    Dim y As Integer = 0
    While y < x
        y += 1
        Reset()
        lblProgress.Text = y & "/" & x
    End While
End Sub


Private Sub Reset()
    Threading.Thread.Sleep(200)
End Sub

Ответы [ 4 ]

1 голос
/ 27 февраля 2012

ваш lblProgress не будет обновляться, пока поток жив. Вы получите только окончательное значение y & x, т.е. когда поток не работает. Вы можете хранить значения Y & X внутри переменной сеанса.

Private Sub ResetAll()
    Dim y As Integer = 0
    While y < x
        y += 1
        Reset()
        Session("CurrentStatus") = y & "/" & x

    End While
End Sub

Из вашего пользовательского интерфейса вы запустите асинхронное событие, используя PageMethod, т.е.

function GetCurrentThreadStatus()
{
       PageMethods.GetThreadStatus(function(status){
           // success
           $("span[id*='lblProgress']").text(status);
       });
}

Код сзади: C #

[WebMethod]
public static string GetThreadStatus()
{
     return  (string)Session["CurrentStatus"];
}
0 голосов
/ 28 февраля 2012

Хорошо, с помощью различных веб-сайтов мне удалось это сделать.

Вот пример проекта. Пожалуйста, дайте мне знать, если есть какие-либо проблемы с этим. Я не эксперт, поэтому хотел бы получить отзыв!

http://www.mediafire.com/?7vn16vp78rave6a

0 голосов
/ 27 февраля 2012

Вы не понимаете, как работают веб-страницы.

Когда поток запущен и вы напишите ответ клиенту, вы не сможете продолжать обновлять страницу по мере продвижения потока.

Один из способов сделать это - использовать Ajax.Улхас уже показал вам способ сделать это;все, что вам нужно сделать, это иметь функцию javascript, которую он написал, вызывать саму себя, пока вы не получите 100% завершение.Вы можете сделать это с помощью таймера.

0 голосов
/ 27 февраля 2012

Поскольку это веб-сайт, вам, вероятно, понадобится использовать какой-то метод ajax для периодического обратного вызова на сервер.Вот основной поток вашей программы, насколько я вижу:

  • Пользователь делает первоначальный вызов
  • Раскрутите новый поток, чтобы запустить процесс и вернуться с состоянием 0%
  • Периодически вызывайте веб-сервер через ajax (вызов GetStatus, который будет возвращать процент завершения)
    • Если вызов завершен, обновите / обновите страницу соответствующим образом
    • Если вызов не завершен, используйте возвращенный статус

Теперь я не настолько уверен в деталях, учитывая, что это веб-страница, но вы могли быпопробуйте периодически сохранять состояние в переменной сеанса (что может или не может быть возможно после того, как вы уже вернулись), и тогда GetStatus просто прочитает самое последнее состояние.Если сессия не работает, вам нужно сохранить статус другим способом (БД, файл и т. Д.).

Только будьте осторожны с тем, как часто вы сохраняете статус.Слишком часто и вы замедляете свой процесс, и слишком мало, и вы не предоставляете точное представление о состоянии.

Последнее, если вы можете перейти на .NET 4.0, то это становится еще более тривиальным с использованием TPL(Задача параллельной библиотеки)

...