user1972654
user1972654

Reputation: 23

How to use threads in asp.net?

I have web forms application. On one form I have a few functions. Which are called syncronously and takes some time. So I need to call them in different threads.

This is the sample of what I'm doing:

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

If I debug (set breackpoints) lbl1.Text = "Function1 completed"; and lbl2.Text = "Function2 completed"; is getting called, but there texts are not changing on final html page.

Also Page load does not takes 5 sec.

p.s. I know asp net works different but I have no idea what I'm doing wrong.

Upvotes: 2

Views: 32407

Answers (3)

Steve Mayne
Steve Mayne

Reputation: 22858

Nothing is waiting for your threads to complete before the page is rendered and returned - that's what's wrong.

To the end of your Page_Load() function (or at the latest-possible point in the page rendering lifecycle), add:

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

Additionally: you should not update lbl1 and lbl2 within the thread proc - you should store the result(s) in variables and reflect the calculated values in the main rendering thread (i.e. once Join has returned).

Edit: Although this fixes the problem in the question, have a look at PageAsyncTask as recommended by Vano's answer.

Upvotes: 9

Vano Maisuradze
Vano Maisuradze

Reputation: 5909

If you want to execute functions asynchronously, you need some steps to do:

1). you need to set Async="true" page directive.

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

2). You need to create PageAsyncTask object and register it using Page.RegisterAsyncTask() function.

RegisterAsyncTask function registers your function in syncronization context so ASP.NET will run your function asynchronously and also waits for all registered function to complete and then continues page processing.

Upvotes: 2

lboshuizen
lboshuizen

Reputation: 2786

You start new threads but don't wait for them to complete. Hence your page_load runs to completion since thread.start() is non blocking.

Have a look at async/wait in the latest .NET version. It makes things a lot easier and predictable

Upvotes: 0

Related Questions