我正在尝试使用下面的调度程序调用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