Will a request in IIS run on a single thread?

We have a system that runs in IIS.

The system should always run using the same “culture”, but we cannot rely on the server settings being set correct.

One way to do it is to specify the culture everytime we do a ToString.

However, we were wondering, is it possible to set the culture on a thread at the begining of a method and rely on all the code in that method being run on the same thread?


Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

No. ASP.NET exhibits thread agility – in some situations, the request may move from one thread to another at specific points in its request lifecycle. (It’s not “just anywhere”; this blog post gives more specific details.)

Unfortunately this isn’t as clearly documented as it might be, and it’s relatively hard to provoke – so you can easily get into the situation where under test loads, all is fine – but in production things go wrong.

However, some tests I ran a while ago (look for “jskeet” within the page) suggests that Thread.CurrentCulture is preserved even when thread agility kicks in.

Method 2

If you know you want the culture to stay the same for all threads, then that should be a fine approach.

However, if you need to set the culture on, say, a per-request basis that may be different from one request to the next, that can potentially not be a reliable approach. Under high load, we have seen threads reused for multiple requests and requests migrated from one thread to another, leaving their culture (and other threadstatic info) behind.

Method 3

Do you dynamically change the culture? If not, you can set the culture in the web.config file.

  <globalization culture="ja-JP" uiCulture="zh-HK" />

You can also set it at page level:
<%@Page Culture="fr-FR" Language="C#" %>

And on the thread:
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");

But for what you are using, the page-level or web.config level seems like the most appropriate perhaps.

Method 4

As others pointed out, ASP.NET might decide to process parts of the same request in different threads. However, you are talking about initializing thread-static stuff at the beginning of each method, so this restriction does not apply to you: I’m quite sure that ASP.NET cannot change the current thread in the middle of one of your methods, so your approach should be fine.

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Notify of

Inline Feedbacks
View all comments
Would love your thoughts, please comment.x