The Wait Class
Back when I did most of my coding with C++ I really liked the simplicity and compactness of using class constructors and destructors to do simple tasks such as setting a wait or busy cursor. For example, consider the code in Figure 1. It is a compact and simple API that is very easy to use and hard to use incorrectly.
void SomeClass::SomeMethod(){ //at this point the constructor would run and set our //cursor to busy. CWaitCursor cur; //do some work here }//at this point the destructor would run setting our//cursor back to its original state. |
Figure 1
Today however I use C# as my primary development language and wanted to keep with what I knew worked in the C++ world so well. Since the CLR does not run the destructors (or finalizers) on its objects at predictable times there needed to be some modification to how I would implement and use the C# version of CWaitCursor (Figure 2).
internal class Wait : IDisposable{ Cursor _savedCursor; Form _form; public Wait(Form form) { if(form == null) throw new ArgumentException("form"); _form = form; _savedCursor = _form.Cursor; _form.Cursor = Cursors.WaitCursor; } public void Dispose() { _form.Cursor = _savedCursor; }} |
Figure 2
Now to use my Wait class all I need to do is instantiate a new instance within one of my Forms, pass a reference to that form and use the "using" construct offered by the C# language.
public void SomeMethodOfAForm(){ using(new Wait(this)) { //do some work here }} |
Figure 3
Ok at this point I should say I don't want to get into any debate with anyone over which language is better, which method is more preferred, etc... I will also point out before I am sure someone else will that this cannot be used with ASP.NET, ok you got me!
Correction: Rico was kind enough to point out that my Wait class was not finalizable so I did not need to SuppressFinalize on it.