6 Comments

  • During the past couple of days? You mean at some point between Ayende's talk and staying up until 4am and doing something like traveling on Friday... well I guess thats a couple of days :)

    I really enjoyed this part of Ayende's talk and love where you took it.

    Very sweet!

  • Interesting you should post this as I've been scratching my head thinking there must be an easier way than:

    if (this.InvokeRequired)
    this.Invoke(new MethodInvoker(delegate()
    {
    doSomeUIWork();
    }));
    else
    {
    doSomeUIWork();
    }

    for every single UI updating method in a form.

    Have you done any performance benchmarks?

  • Jason: No Benchmarks, but then, when you're updating your UI from a background thread, that's hardly a perf-issue.
    I am doing some caching on the proxy side of things to make sure that I don't re-get all attributes of a method on every call to it, but only on the first call.
    basically that means that the "GetCustomAttributes() method is called once per virtual method on a form, which should definitely save some cycles.
    It also ignores the "WndProc" loop totally.

    I have not used this yet on a real application, but after a bit of smoke testing it seems to be ok (that is - no smoke is coming out of my machine when I test it!)
    Roy.

  • That's a good idea - but maybe more flexible to refactor to a method that accepts a delegate (by which you can supply an anonymous one)?

    Chris

  • hammet: no, he didn't mention it.
    Looking at the code, it certainly looks like it will do the job!
    Cool.

    I still prefer using my way because it allows very easy out of the ox extensiblity with intercepting attributes with just one single class.

    Thanks for the update!

  • A few years ago I built a framework in .NET 1.1 to be used by former web programmers (with no previous knoledge of threading or Windows Forms) that had a class Event with a Fire method that took the delegate to fire and, if not null, iterated though the invocation list (Delegate.GetInvocationList()) and, if the Delegate.Target was of a type implementing System.ComponentModel.ISynchronizeInvoke Interface, it would call Traget.Invoke; otherwise Delegate.DynamicInvoke was used.

    Couldn't the same be used here?

Comments have been disabled for this content.