2012-10-31 13 views
7

Mam potrzebę wykonania zadania w tle, które ma pasek postępu, który pokazuje procent zrobiony i przycisk anulowania. Szczegóły zadania na bok, na razie chcę tylko, aby przykład działał, więc mam tylko trzy główne programy obsługi zdarzeń (DoWork, ProgressChanged i RunWorkerCompleted) oraz pętlę, która tylko zwiększa licznik i śpi przez 50 ms w DoWork. Jednak nie aktualizuje się, z wyjątkiem jednego na końcu.Używanie pracownika tła w środowisku ASP.NET z AJAX

W Windows Forms używam pracownika tła i działa on poprawnie bez żadnych problemów. Chciałbym użyć tego samego kodu. Jednak widziałem rzeczy, które mówią, że ASP.NET musi używać AJAX, aby uzyskać tę samą funkcjonalność. Więc moje pytania są następujące:

1) Czy naprawdę potrzebuję AJAX, aby użyć pracownika w tle?

2) Jeśli tak, ja potrzebuję AJAX, co jest najprostszym, najbardziej najprostszy sposób osoba, która nie wie nic o cerować AJAX może zrobić, aby dostać pracownika do tła i uruchomiony na ASP. Strona internetowa NET?

3) Jeśli nie mam, nie potrzebuję AJAX, czy ktoś może wskazać mi działającą próbkę, która jej nie używa? Jestem zainteresowany, nawet jeśli używa innej metody przewijania niż pracownicy w tle.

Przepraszamy za wieloczęściowe pytanie! Jeśli możesz odpowiedzieć na jedno lub drugie, byłoby to bardzo cenne. Naprawdę nie mam nic przeciwko której metodzie używam tak długo, jak to działa.

Kod odniesienia ze strony .cs:

protected void bwProcess_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    lblProgress.Text = "Task Complete: " + e.Result; 
} 

protected void bwProcess_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    lblProgress.Text = e.ProgressPercentage.ToString(); 
} 

protected void bwProcess_DoWork(object sender, DoWorkEventArgs e) 
{ 
    for (int i = 0; i <= 100; i++) 
    { 
     if (bwProcess.CancellationPending) 
     { 
      lblProgress.Text = "Task Cancelled."; 
      e.Cancel = true; 
      return; 
     } 
     bwProcess.ReportProgress(i); 
     Thread.Sleep(50); 
    } 
    e.Result = "100%"; 
} 

protected void BWClick(object sender, EventArgs e) 
{ 
    lblProgress.Text = "Firing Process..."; 
    bwProcess = new BackgroundWorker(); 
    bwProcess.WorkerReportsProgress = true; 
    bwProcess.WorkerSupportsCancellation = true; 
    bwProcess.DoWork += new DoWorkEventHandler(bwProcess_DoWork); 
    bwProcess.ProgressChanged += new ProgressChangedEventHandler(bwProcess_ProgressChanged); 
    bwProcess.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwProcess_RunWorkerCompleted); 

    if (bwProcess != null) 
    { 
     bwProcess.RunWorkerAsync("StartAsynchronousProcess"); 
    } 
} 

Inne uwagi: Wszedłem Async = "true" i enableSessionState = "readonly" w @Page.

Z góry dziękuję!

+0

Zobacz http://stackoverflow.com/questions/57845/backgroundworker-thread-in-asp-net – Despertar

+0

http://msdn.microsoft.com/en-us/library/ms178210%28v=vs.85% 29.aspx jest bardziej aktualną wersją.Nie wiem, jak dostosować to do paska postępu, ale myślę, że powoli zbliżam się. – Brandi

Odpowiedz

4

Programowanie w Internecie oferuje wiele wyzwań, które są łatwe do zaakceptowania podczas programowania komputerowego. Przejście z jednego na drugie może wymagać wielu zmian. Tarła długich wątków jest jedną z tych rzeczy, które wymagają większej ostrożności, aby uniknąć pułapek. Pula aplikacji nie ma informacji o wątkach, które odradzają się, więc po jej przetworzeniu zabije te wątki powodując nieoczekiwane zachowanie w aplikacji. Więcej informacji na ten temat można znaleźć pod tym adresem: Can I use threads to carry out long-running jobs on IIS?

Oznacza to, że musisz użyć bardziej trwałych środków, aby śledzić postępy. Prawdopodobnie baza danych byłaby najlepsza, ale nawet plik będzie trwał po ponownym przetworzeniu puli.


AJAX byłby idealny do tego, ponieważ to pozwala wyciągnąć postępy z bazy danych asynchronicznie w tle i aktualizacji strony internetowej. Oto krótki przykład tego, jak możesz to osiągnąć. Wszystkie obliczenia procentowe są wykonywane po stronie serwera.

function getProgress() { 
    $.ajax({ 
     url: '/progress',   // send HTTP-GET to /progress page 
     dataType: 'json',   // return format will be JSON 
     success: function(result) { // function to run once the result is pulled 
      $("#p1").html('Percentage: %' + result); 
      if (result == "100") 
       clearInterval(window.progressID); 
     } 
    }); 
} 

function startGetProgress() { 
    window.progressID = setInterval(getProgress, 10000); // update progress every 10 seconds 
} 

Powyższy przykład używa metody ajax jQuery http://api.jquery.com/jQuery.ajax/ więc trzeba będzie odwołać się do biblioteki jQuery.

Niezależnie od tego, czy korzystasz z formularzy internetowych, czy z mvc, możesz dodać kontroler sieciowy do obsługi żądania ajax. Daj mi znać, jeśli potrzebujesz mnie do wyjaśnienia czegokolwiek.

+0

Dzięki - co za frustrujące! – Brandi

Powiązane problemy