Thread.Sleep()之后的COMException

时间:2013-05-25 18:40:56

标签: c# exception browser

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

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

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

1 个答案:

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