Developer Support

Advocacy and Innovation

The danger of TaskCompletionSource class

... when used with async/await. TaskCompletionSource class is a very useful facility if you want to control the lifetime of a task manually. I share a canonical example when TaskCompletionSource is used for converting the event-based asynchronous code to the Task-based pattern.

Performance implications of default struct equality in C#

If you're familiar with C#, then you most likely heard that you should always override and for custom structs for performance reasons. To better understand the importance and the rationale behind this advice we're going to look at the default behavior to see why and where the performance hit comes from. Then we'll look at a performance bug ...

The performance characteristics of async methods in C#

The async series In the last two blog posts we've covered the internals of async methods in C# and then we looked at the extensibility points the C# compiler provides to adjust the behavior of async methods. Today we're going to explore the performance characteristics of async methods. As you should already know from ...

Extending the async methods in C#

The async series In the previous blog post we discussed how the C# compiler transforms asynchronous methods. In this post, we'll focus on extensibility points the C# compiler provides for customizing the behavior of async methods. There are 3 ways how you can control the async method's machinery: Custom...

Managed object internals, Part 4. Fields layout

In the recent blog posts we've discussed invisible part of the object layout in the CLR: This time we're going to focus on the layout of an instance itself, specifically, how instance fields are laid out in memory. (image) There is no official documentation about fields layout because the CLR authors reserved the right ...

Managed object internals, Part 3. The layout of a managed array

Arrays are one of the basic building blocks of every applications. Even if you do not use arrays directly every day you definitely use them indirectly as part of almost any library. C# has arrays from the very beginning and back in the day that was the only "generic"-like and type safe data structure available. Today you may use them less ...

Managed object internals, Part 1. The layout

The layout of a managed object is pretty simple: a managed object contains instance data, a pointer to a meta-data (a.k.a. method table pointer) and a bag of internal information also known as an object header. (image) The first time I’ve read about it, I’ve got a question: why the layout of an object is so weird? Why a managed ...

To box or not to Box? That is the question!

Discussions on reddit, hacker news. Recently I've noticed that the Equal method from our ValueTuple (*) struct generates significant memory traffic (~1Gb). That was a bit of a surprise to me. This struct is well designed and was used pretty heavily in many performance critical scenarios. Here how the struct looks like: (*) Our ...

Garbage collection and variable lifetime tracking

Here is a seemingly simple question for you: Is it possible that the CLR will call a finalizer for an instance when an instance method is still running? In other words, is it possible in the following case to see ‘Finalizing instance.’ before ‘Finished doing something.’? The answer is: “It depends”. In debug builds this will ...