0

我有 C# 程序来解析论坛上的新帖子。当我解析没有帖子的页面(帖子不存在)时,我使用

if (find("Doesn't exist"))
{
     System.Threading.Thread.Sleep(10000);
     button2.PerformClick();
}

然后通常再次发布不存在,并且线程再次休眠 10 秒。但是在我遇到带有 HRESULT 的 COMException 之后:0x800700AA。如何避免此异常以及我做错了什么?谢谢。

4

1 回答 1

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 的文章描述了这个问题的各种解决方案,我为你挑选了最好的:

于 2013-05-25T20:09:24.177 回答