我在C#中有程序用于在论坛上解析新帖子。当我没有帖子解析页面(帖子不存在)时,我使用
if (find("Doesn't exist"))
{
System.Threading.Thread.Sleep(10000);
button2.PerformClick();
}
然后通常再次发布不存在并且线程再次休眠10秒。但是在我使用HRESULT的COMException之后:0x800700AA。如何避免这种异常以及我做错了什么?感谢。
答案 0 :(得分:0)
此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的文章描述了这个问题的各种解决方案,我选择了最适合你的文章: