I think this is a timing issue - there's no guarantee that your worker thread will have executed by the time you get to setting your label's values. It takes a few MS to create and launch the tread. By then, the rest of your main thread has probably completed. You can test this by putting debug output and seeing the order in which your code is executed.
If you need to guarantee that the code in your thread executes (which eliminates the need for a thread) - you could use a WaitOne() threading method to have your main thread wait for the worker thread to return. But depending on a value set in a thread to be available in a parallel process is risky.
Additionally - IMHO, I wouldn't use threads in ASP.NET apps - I believe the consensus is that they're a bit dangerous. I've seen app pool crashes because of bad code inside a spawned thread.