jagdipa
jagdipa

Reputation: 540

asp.net async thread with pooling

I have a long running task that I need to implement on a webpage. What I would like to do is run the task on a separate thread, but have a progress bar on the webpage.

I am struggling to find an easy way of doing this. Here is a very simplified example that I want to do this on. Basically, I want the ResetAll() in a thread, and pool the variable y to update the webpage UI.

Can someone help me?

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

Upvotes: 0

Views: 310

Answers (4)

jagdipa
jagdipa

Reputation: 540

Okay, with the help of various websites, I managed to do this.

Here is a sample project. Please let me know if there are any problems with this. I'm no expert, so I would like some feedback!

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

Upvotes: 0

Icarus
Icarus

Reputation: 63972

You are confused about how web pages work.

Once the thread is fired and you write the response to the client, you won't be able to continue updating the page as the Thread progresses.

One way to do this sort of thing is using Ajax. Ulhas already showed you a way top do this; all you need to do is have that javascript function he wrote call itself until you get a 100% completion. You can do that using a timer.

Upvotes: 0

Justin Pihony
Justin Pihony

Reputation: 67135

As this is a website, you will probably need to use some sort of ajax method to call back to the server periodically. Here is the basic flow of your program as far as I can see it:

  • User makes initial call
  • Spin up new thread to run process and return with a 0% status
  • Periodically, make a call to the web server via ajax (A GetStatus call that will return the percentage of completion)
    • If the call is complete, update/refresh the page appropriately
    • If the call is not complete, then use the returned status

Now, I am not as sure about the details given that this is a web page, but you could try to store the status in the session variable (which may or may not be possible once you have already returned) periodically, and then the GetStatus will just read the most current status. If session does not work, then you will need to persist the status another way (db, file, etc).

Just be careful on how often you store the status. Too often and you slow your process down, and too little and you do not give an accurate representation of the status.

Last, if you can upgrade to .NET 4.0, then this becomes even more trivial using the TPL (Task Parallel Library)

Upvotes: 0

Ulhas Tuscano
Ulhas Tuscano

Reputation: 5620

your lblProgress will not update as long as thread is alive. You will get only final value of y & x i.e when thread is dead. You can store the values of Y & X inside a session variable.

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

    End While
End Sub

From Your UI you will fire an asynchronous event using PageMethod i.e

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

Code Behind : C#

[WebMethod]
public static string GetThreadStatus()
{
     return  (string)Session["CurrentStatus"];
}

Upvotes: 1

Related Questions