0

フォーラムの新しい投稿を解析するための C# のプログラムがあります。投稿なしでページを解析するとき(投稿が存在しない)、使用します

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

その後、通常、投稿は再び存在せず、スレッドは 10 秒間スリープ状態になります。しかし、HRESULT: 0x800700AA で COMException が発生した後。この例外を回避する方法と、私が間違っていることは何ですか? ありがとう。

4

1 に答える 1

0

この COMException は、ブラウザ オブジェクトがビジーであることを示します。現在のスレッドをスリープ状態にするのは良い考えではなく、あなたのケースは有害であるため、これは私には思えます。

これをメイン UI スレッドで実行していると仮定しているため、メイン メッセージ ポンプ/キューが強制終了されています。

Windows フォームや WPF など、使用している UI フレームワークに応じて、この問題を解決するためのソリューションは多数あります。

.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 に答える