2015-08-21 3 views
0

Я использую awesomium для автоматизации сайта. Я пытался использовать асинхронное программирование, потому что я не хотел, чтобы мой графический интерфейс зависал, но у меня проблема в событии (появляется всплывающее окно, и я хочу сделать некоторые действия в этом всплывающем окне, пока не закрою его) Продолжайте, как я хочу. После того, как событие запущено, я хочу, чтобы мое приложение продолжило метод события (webc_ShowCreatedWebView и после него с помощью popupTwitter (method)), но я обнаружил, что при выполнении кода JavaScript элемент управления возвращается в методе While из первого метода. после того, как метод earnpoints называется и события обжигают, чтобы закончить событие и метод, после чего возвращает управление в то время.Асинхронные методы и событие

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); 
    } 
+0

Звучит как awesomium не понимает асинхронных событий. Если это так, на самом деле вы ничего не можете сделать, кроме как попросить их поддержать async. –

+0

Мне кажется, что webc_ShowCreatedWebView будет запущен только после возвращения EarnPoints. Может быть, вы можете использовать EventWaitHandle и устанавливать его только в методе popupTwitter. Цикл while будет блокироваться до тех пор, пока не будет установлен EventWaitHandle. Документы MSDN: [link] (https://msdn.microsoft.com/en-us/library/system.threading.eventwaithandle%28v=vs.110%29.aspx) – Francois

ответ

1

у меня также были проблемы, реализующие методы асинхронное с 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 вызывается из.

Смежные вопросы