如何在给定的时间跨度后从 Dispatch.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秒,因此我相信调度程序应该在10秒后出现,tempList仍然为空。但是线程在 20 秒内睡眠良好,并且 tempList 不为空。

我知道 Invoke 是一个同步操作,在作业完成之前不会返回 - 这就是为什么我添加了 TimeSpan 以在一段时间后返回,即使作业未完成。

这里有什么不正确的?

谢谢

RDV

我在Dispatcher类中查看了该方法的源代码,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的含义.

刚刚发现如果给定超时值,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 后设置睡眠,但它仍然保持空。我正在使用.NET 4.6.2,因此我相信TimeSpan是调度程序的超时值。没有引发异常。

谢谢

RDV

相关内容

  • 没有找到相关文章

最新更新