No wonder. A quick answer is: using threading is not suitable to ASP.NET due to the nature and limitations of HTTP and the operation of HTTP server and a Web browser. Everything happens between a Web browser sending a request to a HTTP server and loading a resource generated by a server in a browser. All the runtime if your ASP.NET application happens between these two events, so it cannot be prolonged in time.
You can create some more advanced schema with additional external custom service consumed by your Web application from the server side, but this is a long story (I don't want to get into it right now because I don't know your ultimate goals and because this is not possible with a typical Web hosting provider; you would need an in-house server or a fully-fledged cloud solution).
Maybe the ultimate goal of your application is simple enough to be reached by a simpler solution, without an extra thread. If you explain it, you might get a chance to receive some useful advice.
[EDIT in response to follow-up discussion]
In the case you describe, you probably should continue using Ajax timer, but not the thread on the server side. Instead, you need to perform database polling on requests from the clients. Now, as you can have too frequent requests as polling by timer is very excessive and different clients send the same requests, you need to actually poll the database only on some of the events.
For this purpose, you need to record timestamp from the resent poll and compare it with the server time at the moment of the HTTP request. You should perform the actual poll only if the time span between the last actual poll and HTTP request time is big enough. When you actually poll, it would be also good it you could detect that there is a change in data compared to the previous poll. You need to create a data cache of the whole page with new data and update this cache only when actual data from the database change. This cache should be fully-generated page or its major fragment stored on the server. In HTTP response, you should always send the data from this cache, and update this cache only when the actual poll is done (as I explained before, not on every HTTP request) and only if actual data has been changed in the database since the last poll.
This is probably the simplest solution.
The problem of the limitation of Web technology is difficult. The radical approach would be using of the
push technology. You can learn what's involved starting from here:
http://en.wikipedia.org/wiki/Server-push[
^].
—SA