We might, on occasion, need to check whether an application we’ve spawned has a responsive UI or ofcourse we might wish to check our own application, for example within a timer polling the following code to check the application is still responsive.
Firstly, we could use the property Responding on the Process class which allows us to check whether a process’s UI is responsive.
Process p = Process.Start("SomeApplication.exe"); if(!p.Responding) { // the application's ui is not responding } // on the currently running application we might use if(!Process.GetCurrentProcess().Responding) { // the application's ui is not responding }
Alternatively we could use the following code, which allows us to set a timeout value
public static class Responsive { /// <summary> /// Tests whether the object (passed via the ISynchronizeInvoke interface) /// is responding in a predetermined timescale (the timeout). /// </summary> /// <param name="si">An object that supports ISynchronizeInvoke such /// as a control or form</param> /// <param name="timeout">The timeout in milliseconds to wait for a response /// from the UI</param> /// <returns>True if the UI is responding within the timeout else false.</returns> public static bool Test(ISynchronizeInvoke si, int timeout) { if (si == null) { return false; } ManualResetEvent ev = new ManualResetEvent(false); si.BeginInvoke((Action)(() => ev.Set()), null); return ev.WaitOne(timeout,false); } }
In usage we might write the following
if (IsHandleCreated) { if (!Responsive.Test(this, reponseTestDelay)) { // the application's ui is not responding } }