Delayed function calls

后端 未结 12 1318
星月不相逢
星月不相逢 2020-11-30 22:07

Is there a nice simple method of delaying a function call whilst letting the thread continue executing?

e.g.

public void foo()
{
    // Do stuff!

           


        
12条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-30 22:28

    Aside from agreeing with the design observations of the previous commenters, none of the solutions were clean enough for me. .Net 4 provides Dispatcher and Task classes which make delaying execution on the current thread pretty simple:

    static class AsyncUtils
    {
        static public void DelayCall(int msec, Action fn)
        {
            // Grab the dispatcher from the current executing thread
            Dispatcher d = Dispatcher.CurrentDispatcher;
    
            // Tasks execute in a thread pool thread
            new Task (() => {
                System.Threading.Thread.Sleep (msec);   // delay
    
                // use the dispatcher to asynchronously invoke the action 
                // back on the original thread
                d.BeginInvoke (fn);                     
            }).Start ();
        }
    }
    

    For context, I'm using this to debounce an ICommand tied to a left mouse button up on a UI element. Users are double clicking which was causing all kinds of havoc. (I know I could also use Click/DoubleClick handlers, but I wanted a solution that works with ICommands across the board).

    public void Execute(object parameter)
    {
        if (!IsDebouncing) {
            IsDebouncing = true;
            AsyncUtils.DelayCall (DebouncePeriodMsec, () => {
                IsDebouncing = false;
            });
    
            _execute ();
        }
    }
    

提交回复
热议问题