WebBrowser控件 - 等到文档完成扩展方法

时间:2016-03-16 21:19:17

标签: c# .net async-await webbrowser-control

我正在为WebBrowser控件创建一个扩展方法,其目的是在返回之前等待页面完成完全加载

通过完全加载,我的意思是在最后一次DocumentCompleted事件之后必须经过一秒钟。这是为了说明在加载页面期间触发多个DocumentCompleted事件的页面(这会影响我当前的应用程序)。

我已经编写了当前可行的方法,但我觉得可以改进:它可能会在没有必要的情况下返回任务,并且还会遇到异常将被抛出的问题如果应用程序在等待页面加载时关闭。

    public static Task<bool> WaitLoad(this WebBrowser webBrowser, int wait)
    {
        var timerInternalWait = new Timer {Interval = 1000, Tag = "Internal"};
        var timerMaxWait = new Timer {Interval = wait};
        var tcs = new TaskCompletionSource<bool>();

        WebBrowserNavigatingEventHandler navigatingHandler = (sender, args) => timerInternalWait.Stop();
        webBrowser.Navigating += navigatingHandler;

        WebBrowserDocumentCompletedEventHandler documentCompletedHandler = (sender, args) => { timerInternalWait.Stop(); timerInternalWait.Start(); };
        webBrowser.DocumentCompleted += documentCompletedHandler;

        EventHandler timerHandler = null;
        timerHandler = (sender, args) =>
        {
            webBrowser.Navigating -= navigatingHandler;
            webBrowser.DocumentCompleted -= documentCompletedHandler;
            timerInternalWait.Tick -= timerHandler;
            timerMaxWait.Tick -= timerHandler;
            timerMaxWait.Stop();
            timerInternalWait.Stop();

            tcs.SetResult(((Timer) sender).Tag.ToString() == "Internal");
        };

        timerInternalWait.Tick += timerHandler;
        timerMaxWait.Tick += timerHandler;

        return tcs.Task;
    }

我能做些什么来改善它吗?

1 个答案:

答案 0 :(得分:0)

The design guidelines state that asynchronous methods should be suffixed.

该计时器使您的代码更难阅读。试试这个:

    public class MainActivity extends AppCompatActivity {

    // These variable are destroyed along with Activity
    private int someVarA;
    private String someVarB;

    ...

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("someVarA", someVarA);
        outState.putString("someVarB", someVarB);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        someVarA = savedInstanceState.getInt("someVarA");
        someVarB = savedInstanceState.getString("someVarB");
    }
 }

但你应该考虑取消令牌而不是双倍计时器。