异步方法和事件

本文关键字:事件 异步方法 | 更新日期: 2023-09-27 18:09:06

我使用awesomium来自动化站点。我尝试使用异步编程,因为我不想让我的GUI冻结,但我有一个问题,在一个事件(弹出窗口出现,我想在这个弹出窗口做一些动作,直到我关闭它),当应用程序不继续我想要的方式。事件被触发后,我希望我的应用程序继续使用事件方法(webc_ShowCreatedWebView和popupTwitter(方法)之后,但我发现,在执行JavaScript代码时,控件从第一个方法返回While。在调用earnpoints方法并触发事件以完成事件和方法之后,控件在while中返回之后,我怎么能做到这一点呢?

  private async void button4_Click(object sender, EventArgs e)
    {
        Twitter twitter = new Twitter(webView);
        twitter.Login(webView);
        webView.ShowCreatedWebView += webc_ShowCreatedWebView;
        addmefast.Login(webView);
        int i = 0;
        while (i < 10)
        {
            Task earnpoints = EarnPoints(webView);
            await earnpoints;
            //Here i don't want to continue until EarnPoints method > webc_ShowCreatedWebView event > popupTwitter method it's finished.
            i++;
        }
    }
    public async Task EarnPoints(IWebView web)
    {
        web.Source = "http://addmefast.com/free_points/twitter".ToUri();
        await Task.Delay(3000);
        web.ExecuteJavascript("document.getElementsByClassName('single_like_button btn3-wrap')[0].click();"); //event fired: webc_ShowCreatedWebView
    }
    async void webc_ShowCreatedWebView(object sender, ShowCreatedWebViewEventArgs e)
    {
        WebView view = new WebView(e.NewViewInstance);
        await popupTwitter(view);
    }
   async Task popupTwitter(WebView view)
    {
        Popupform FormTwitter = new Popupform(view);
        FormTwitter.Show();
       await  Task.Delay(6000);
        FormTwitter.Twitter();
        await Task.Delay(2000);
        FormTwitter.Close();
        await  Task.Delay(4000);
    }

异步方法和事件

我在使用awesomium实现异步方法时也遇到了问题,但最终还是成功了。

首先我做了这个包装。必须在主线程上创建。

public class AsyncWebView
{
    public static SynchronizationContext _synchronizationContext;
    private readonly WebView _webView;
    public AsyncWebView()
    {
        _synchronizationContext = SynchronizationContext.Current;
        _webView = WebCore.CreateWebView(1024, 900);
    }
    public async Task Navigate(String url)
    {
        Debug.WriteLine("Navigating");
        TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
        FrameEventHandler handler = (sender, args) =>
        {
            Debug.WriteLine(args.Url);
            if (!_webView.IsNavigating && !_webView.IsLoading)
                tcs.SetResult(true);
        };
        _webView.LoadingFrameComplete += handler;
        _synchronizationContext.Send(SetWebViewSource, url);
        await tcs.Task;
        _webView.LoadingFrameComplete -= handler;
        Debug.WriteLine("Done");
    }
    private void SetWebViewSource(object url)
    {
        _webView.Source = new Uri((string)url);
    }
}

用法:

async Task test()
{
    await webView.Navigate("http://www.nytimes.com");
    Debug.WriteLine("All done");
}

确保你有一个SynchronizationContext,其中AsyncWebView构造函数是从。