Manipulating Controls Across Threads


Methods that affect a Windows Forms control can be executed only on the thread that created the control. .NET does not permit directly manipulating controls across threads. The Visual Studio compiler under .NET 2.0 will mark these attempts as errors. .NET 1.1 will allow them, but these will often result in unexpected behavior like incorrectly-painted controls.

Read the rest of this entry »

Enumerate Collections without Exceptions


It’s important to note that an enumerator does not have exclusive, thread-safe access to its collection.  Even when a collection is synchronized, other threads can still modify the collection.  Therefore, a collection’s contents can change while enumerating through it, which will cause the enumerator to throw an exception.  So there are three key ways to safely enumerate a collection:

Read the rest of this entry »

Grow Your Own SyncRoot


Multi-threaded code is challenging to get right and even harder to debug once it’s gone wrong. This is especially true when attempting to collect data from multiple threads. To make this easier, many .NET collection classes include the SyncRoot property to maintain proper synchronization with other threads that might be simultaneously modifying the collection. But then Microsoft changed its mind in .NET 2.0 and decided to let the developer decide how to manage synchronization, and so none of the new generic collections have a SyncRoot property.

Read the rest of this entry »

Convert Between Synchronous and Asynchronous


When a program calls a synchronous function, the program halts and waits for the function to finish executing. When a program calls an asynchronous function, the program does not wait and continues to execute while the asynchronous function executes in the background.

By default, C# methods are synchronous. External functions that can take a long time to execute–such as interprocess communications (IPC) and database queries–are typically asynchronous. However, there may be instances where you need to make a synchronous function asynchronous and vice-versa.

Read the rest of this entry »