.NET: 100% CPU usage in HttpClient because of Dictionary? .NET: 100% CPU usage in HttpClient because of Dictionary? multithreading multithreading

.NET: 100% CPU usage in HttpClient because of Dictionary?


Thanks for all the comments; they got me thinking along different lines, and helped me find the ultimate root cause of the issue.

Although the issue was a result of corruption in the backing dictionary of the DefaultRequestHeaders, the real culprit was the initialization code for the HttpClient object:

private HttpClient InitializeClient(){    if (_client == null)    {        _client = GetHttpClient();        _client.DefaultRequestHeaders.Accept.Clear();        _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));        SetBaseAddress(BaseAddress);    }    return _client;}

I said that the HttpClient was a singleton, which is partially incorrect. It's created as a single-instance that is shared amongst multiple threads doing a unit of work, and is disposed when the work is complete. A new instance will be spun up the next time this particular task must be done.

The "InitializeClient" method above is called every time a request is to be sent, and should just short-circuit due to the "_client" field not being null after the first run-through.

(Note that this isn't being done in the object's constructor because it's an abstract class, and "GetHttpClient" is an abstract method -- BTW: don't ever call an abstract method in a base-class's constructor... that causes other nightmares)

Of course, it's fairly obvious that this isn't thread-safe, and the resultant behavior is non-deterministic.

The fix is to put this code behind a double-checked "lock" statement (although I will be eliminating the use of the "DefaultRequestHeaders" property anyways, just because).

In a nutshell, my original question shouldn't ever be an issue if you're careful in how you initialize the HttpClient.

Thanks for the clarity of thought that you all provided!