Here is another wonderful contribution from Daren Thomas: A Pattern for Asynchronously Updating Revit Documents.
As an attentive reader of this blog, you will certainly remember one of my favourite and most powerful recent projects, the modeless loose connector navigator. It retrieves and displays a list of unconnected MEP connectors in a modeless dialogue box. Being modeless, the dialogue is not within the context of a Revit external command Execute method, nor any other Revit API call-back, and thus has no access to the Revit API, which does not permit asynchronous access. Happily, the Idling event provides a workaround for that.
The modeless loose connector navigator demonstrates a solution for handling a very specialised need, accessing the Revit API semi-asynchronously to highlight the elements with loose connectors.
Daren's post generalises this solution, allowing a modeless dialogue to queue up a whole collection of actions to be taken, which can then be picked up and processed by the Idling event handler the next time it becomes active. A wonderful generic solution, including neat features such as:
- Use of the generic Queue template class.
- Use of the generic Action delegate, cf. 5. Generic Delegates.
- Locking support to protect against simultaneous access to the queue from the modeless dialogue and the Idling event.
- Use of .NET => lambda statements to execute the queued-up tasks.
A truly beautiful job, Daren. Thank you!