public static async Task <CursorWait> NewAsync(Control objControl = null, bool blnAppStarting = false, CancellationToken token = default) { CursorWait objReturn = new CursorWait(objControl, blnAppStarting); if (objReturn._objControl == null) { if (Interlocked.Increment(ref _intApplicationWaitCursors) == 1) { Application.UseWaitCursor = true; objReturn._blnDoUnsetCursorOnDispose = true; } return(objReturn); } Form frmControl = objReturn._objControl as Form; try { if (frmControl == null || await frmControl.DoThreadSafeFuncAsync(x => x.IsMdiChild, token)) { if (frmControl != null) { objReturn._frmControlTopParent = await frmControl.DoThreadSafeFuncAsync(x => x.MdiParent, token); } else if (objReturn._objControl is UserControl objUserControl) { objReturn._frmControlTopParent = await objUserControl.DoThreadSafeFuncAsync(x => x.ParentForm, token); } else if (objReturn._objControl != null) { for (Control objLoop = await objReturn._objControl.DoThreadSafeFuncAsync(x => x.Parent, token); objLoop != null; objLoop = await objLoop.DoThreadSafeFuncAsync(x => x.Parent, token)) { if (objLoop is Form objLoopForm) { objReturn._frmControlTopParent = objLoopForm; break; } } } } } catch (OperationCanceledException) { await objReturn.DisposeAsync(); throw; } if (objReturn._objControl != null) { if (objReturn._blnAppStartingCursor) { int intNewValue = s_DicCursorControls.AddOrUpdate(objReturn._objControl, 1, (x, y) => Interlocked.Increment(ref y)); try { await objReturn.SetControlCursorAsync(intNewValue < short.MaxValue?Cursors.AppStarting : Cursors.WaitCursor, token); } catch (OperationCanceledException) { await objReturn.DisposeAsync(); throw; } objReturn._blnDoUnsetCursorOnDispose = true; } else { s_DicCursorControls.AddOrUpdate(objReturn._objControl, short.MaxValue, (x, y) => Interlocked.Add(ref y, short.MaxValue)); try { await objReturn.SetControlCursorAsync(Cursors.WaitCursor, token); } catch (OperationCanceledException) { await objReturn.DisposeAsync(); throw; } objReturn._blnDoUnsetCursorOnDispose = true; } } return(objReturn); }