2017-06-29 2 views
0

J'ai fait ce petit code:Awesomium erreur multithreading

private void button1_Click(object sender, EventArgs e) 
{ 
    Task t = new Task(() => 
    { 
     tt += "a"; 
     WebCore.Initialize(new WebConfig(), true); 
     WebView browser = WebCore.CreateWebView(1024, 768, WebViewType.Offscreen); 
     browser.DocumentReady += browser_DocumentReady; 
     browser.Source = new Uri("https://www.google.com/"); 
     WebCore.Run(); 
    }); 
    t.Start(); 
    Console.ReadLine(); 
} 

static void browser_DocumentReady(object sender, UrlEventArgs e) 
{ 
    Console.WriteLine("DocumentReady"); 
} 

Pour essayer de faire quelques multi-threading avec différentes vues Web faisant la même chose en même temps.

Chaque fois que j'appuie sur le bouton une fois qu'il fonctionne très bien et me montre « DocumentReady » dans la console mais quand je presse une fois de plus, il me donne cette erreur:

System.InvalidOperationException: 'The WebCore is already initialized.' 

Il fait beaucoup de sens parce que je l'ai déjà initialisé une fois auparavant, mais existe-t-il un moyen d'exécuter ce script plusieurs fois? Awesomium ne doit s'exécuter que dans un thread.

+0

Vous initialisez 'WebCore' à chaque fois que vous cliquez sur le bouton. Assurez-vous d'initialiser ist juste une fois. Par exemple sur le début de l'application ou quelque chose. Ou vous pouvez vous souvenir si vous avez initialisé le WebCore avant avec un drapeau. –

+0

Eh bien, je dois initialiser le webcore dans le même fil que le webview et d'autres choses Awesomium. – Samhakadas

+0

Je vois awesomium ne semble pas être threadsafe et l'air désuet. Pourquoi ne pas utiliser le 'WebClient' natif ou quelque chose comme' ChromiumFX'? –

Répondre

0

il n'y a pas de solution de contournement pour cela. vous ne pouvez pas démarrer plusieurs instances à partir de threads différents. Bien que toute la navigation se produira dans différents processus séparés mais les événements seront plombés dans le thread principal (fyi si vous utilisez winforms doit être gui thread)

si vous voulez des sessions (cookies) avec webclient vous pouvez utiliser CookieContainer séparé avec chaque session

+0

D'accord, connaissez-vous une autre alternative Awesomium? avec multithreading et multi-sessions? – Samhakadas

+0

je pense que tout exige la même chose – TakeMeAsAGuest