如何从调度返回。在给定的时间间隔后调用

时间:2019-01-22 22:37:06

标签: wpf invoke dispatcher timespan

我正尝试使用下面的Dispatcher Invoke API(.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仍然为null。但是Thread可以睡20秒钟,并且tempList不为空。

我知道Invoke是一个同步操作,直到作业完成后才返回-这就是为什么我添加了TimeSpan在一段时间后返回的原因,即使作业尚未完成。

这里有什么不正确的地方?

谢谢

RDV

2 个答案:

答案 0 :(得分:0)

我在Dispatcher类中查看了该method的源代码,并且timeout参数的文档(.NET 4.7.2)说:

/// <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的含义。

答案 1 :(得分:0)

只是发现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保持为空。我还尝试在设置tempList之后设置sleep,但是它仍然保持为空。我正在使用.NET 4.6.2,因此我相信TimeSpan是调度程序的超时值。没有异常。

谢谢

RDV