我有 C# 程序来解析论坛上的新帖子。当我解析没有帖子的页面(帖子不存在)时,我使用
if (find("Doesn't exist"))
{
System.Threading.Thread.Sleep(10000);
button2.PerformClick();
}
然后通常再次发布不存在,并且线程再次休眠 10 秒。但是在我遇到带有 HRESULT 的 COMException 之后:0x800700AA。如何避免此异常以及我做错了什么?谢谢。
此 COMException 指示浏览器对象正忙。在我看来,这似乎是因为让当前线程进入睡眠状态并不是一个好主意,而且你的情况是有害的。
我假设您在主 UI 线程中运行它,这正在杀死您的主消息泵/队列。
有很多解决方案可以解决这个问题,具体取决于您使用的 UI 框架,例如 Windows 窗体或 WPF 等...
即使您使用的是 .Net 4.5 或有幸使用它,您也可以拥有基于那里引入的任务和异步功能的解决方案。
这是我为您推荐的解决方案,但它不是唯一的:
实现这个方法:
public static class UICallbackTimer
{
public static void DelayExecution(TimeSpan delay, Action action)
{
System.Threading.Timer timer = null;
SynchronizationContext context = SynchronizationContext.Current;
timer = new System.Threading.Timer(
(ignore) =>
{
timer.Dispose();
context.Post(ignore2 => action(), null);
}, null, delay, TimeSpan.FromMilliseconds(-1));
}
}
然后你会从你的代码中调用它:
if (find("Doesn't exist"))
{
UICallbackTimer.DelayExecution(TimeSpan.FromSeconds(10),
() => button2.PerformClick());
}
有很多关于 SO 的文章描述了这个问题的各种解决方案,我为你挑选了最好的: