我正尝试使用下面的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
答案 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