Skip to content

Instantly share code, notes, and snippets.

@migueldeicaza
Created September 8, 2015 14:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save migueldeicaza/cd99938c2a4372e7e5d5 to your computer and use it in GitHub Desktop.
Save migueldeicaza/cd99938c2a4372e7e5d5 to your computer and use it in GitHub Desktop.
Probing for events having a single callback on .NET and Mono
const BindingFlags SEARCH_FLAGS = BindingFlags.NonPublic | BindingFlags.Instance;
var hasSingleTargetMethod = typeof(MulticastDelegate).GetMethod("InvocationListLogicallyNull", SEARCH_FLAGS) ??
typeof(MulticastDelegate).GetMethod("get_HasSingleTarget", SEARCH_FLAGS);
if (hasSingleTargetMethod != null)
HasSingleTarget = (HasSingleTargetFn)Delegate.CreateDelegate(typeof(HasSingleTargetFn), hasSingleTargetMethod, true);
else // gracefull degradation
HasSingleTarget = md => md.GetInvocationList().Length == 1;
// ...
static void QueueContinuation(WaitCallback continuation)
{
if (!HasSingleTarget(continuation))
{
foreach (WaitCallback act in continuation.GetInvocationList())
QueueContinuation(act);
return;
}
ThreadPool.QueueUserWorkItem(continuation);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment