Как вернуться из Dispatch.Invoke после указанного времени - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь использовать ниже API Dispatcher Invoke (.Net 4.6), так как я хочу вернуться обратно, если мой делегат требует времени.Проблема в том, что Dispatcher.Invoke не возвращается до тех пор, пока не будет завершен делегат

Пример кода:

    public void PopulateList()
    {
        List<string> tempList = null;
        System.Windows.Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new TimeSpan(0,0,10), (Action)delegate ()
        {
            System.Threading.Thread.Sleep(20000);//Sleep for 20 secs
            tempList = new List<string>();
        });

        if (tempList == null)
        {
            //do something
        }
    }   

TimeSpan установлен на 10 секунд, поэтому я считаю, что Dispatcher должен появиться через 10 секунд сtempList все еще нулевой.Но Thread хорошо спит в течение 20 секунд, а tempList не равен нулю.

Я понимаю, что Invoke - это синхронная операция, и она не будет возвращаться, пока работа не будет выполнена, поэтому я добавил TimeSpan, чтобы через некоторое время возвращаться, даже если работане закончен.

Что здесь не так?

Спасибо,

RDV

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Просто обнаружил, что TimeSpan.FromMilliseconds работает, если задано значение тайм-аута

public void PopulateList()
    {
        List<string> tempList = null;
        System.Windows.Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, TimeSpan.FromMilliseconds(10), (Action)delegate ()
        {
            //any heavy processing work here will be done, 
            //just dont know when timeout is reached and dispatcher 
            //comes out of this delegate
            System.Threading.Thread.Sleep(20);//Sleep for 20 milli secs
            tempList = new List<string>();
        });

        if (tempList == null)
        {
            //do something
        }
    } 

В этом случае tempList остается нулевым.Я также попытался установить sleep после установки tempList, но он все еще остается нулевым.Я использую .NET 4.6.2, поэтому я считаю, что TimeSpan является значением тайм-аута для диспетчера.Исключений нет.

Спасибо,

RDV

0 голосов
/ 23 января 2019

Я посмотрел исходный код для этого метода в классе Dispatcher, а документация (.NET 4.7.2) для параметра timeout гласит:

/// <param name="timeout">
///     The minimum amount of time to wait for the operation to start.
///     Once the operation has started, it will complete before this method
///     returns.
/// </param>

Однако в моей документации (.NET 4.5) для параметра timeout написано:

//   timeout:
//     The maximum time to wait for the operation to finish.

Так что в .NET 4.5 (и я предполагаю, что .NET 4.6) это заставляет вас думать, что метод должен остановиться, если он работает дольше, чем timeout, но это отличается от описания .NET 4.7.2. , Теперь либо функциональность изменилась (я сомневаюсь в этом), либо они прояснили значение timeout.

...