The other answers have established that it's very difficult to guarantee execution order. It's probably true that the events are executed in the order registered, but it might be difficult in your program to guarantee that order. For example, I have an application where events are registered by static class constructors, and apparently C# doesn't call those constructors until the class gets utilized the first time, and who knows what order that will be in.
So, many of the solutions proposed are somewhat complicated methods of changing the order, including Naser Asadi's interesting one of re-registering events. After much thought, I came up with a much simpler approach. I decided to NOT ALTER the registration order, but rather alter what happens in each event handler.
In my application, what I'm trying to do is customize a string, but multiple event handlers might customize it differently, and I don't want to rely on potluck. Instead, each handler has a different "PRIORITY". Each time the string is updated, the priority is updated also. Other handlers can't touch it unless they have a higher priority. It's a brilliantly simple solution; you merely need a way to establish a priority for each handler.
Below is an example of one of the handlers. Note that I could create a similar class and handler for vanilla ice cream also, with a different priority, and if both chocolate and vanilla are registered for the same ice cream shop, the one with higher priority will be the one that decides what the ice cream flavor is. Note that it DOES NOT MATTER if vanilla or chocolate registers their handler first! Only the priority matters, which YOU can control.
public delegate void CustomizeStringEventHandler(Object sender, CustomizeStringEventArgs e);
public class CustomizeStringEventArgs : EventArgs {
string _description;
int _priority;
}
//-----------------------
public class ExampleChocolateIceCreamFlavorClass {
static ExampleChocolateIceCreamFlavorClass() {
DowntownIceCreamShop.LookupDescription += new CustomizeStringEventHandler(CustomizeString);
CountryIceCreamShop.LookupDescription += new CustomizeStringEventHandler(CustomizeString);
}
static void CustomizeString(object sender, CustomizeStringEventArgs e) {
string desc = "Chocolate"
int priority = 50; //priority for chocolate
if ((desc != null) && ((priority > e.Priority) || (e.Description == null))) {
e.Description = desc;
e.Priority = priority;
}
}
}