Awesomium многопоточность

450
01 сентября 2017, 20:47

Работаю с Telegram APi от Mr.Round Robin и Awesomium. В моей работе надо сделать скрин шот сайта. Делаю я это через Awesomium.

var webView = WebCore.CreateWebView(1920, 1080);
{
  webView.Invoke(new Action(() =>
  {
    webView.Source = new Uri("http://google.com");
    while (webView.IsLoading)
    {
       WebCore.Update();
    }
    BitmapSurface surface = (BitmapSurface)webView.Surface;
    surface.SaveToPNG("Screenshot.png", true);
    webView.Dispose();
  }), new object[] { });
}

Но при повторном использовании функции вылетает Exception на var webView = WebCore.CreateWebView(1920, 1080);.

The calling thread cannot access this object because a different thread owns it.

Это вероятно связанно, что библиотека Telegram работает с многопоточностью. Подскажите как решить эту проблему?

Также вопрос #2. Временами дает Exception на WebCore.Update(); мол вышло за пределы границы. Как решить

P.S Приложение консольное

Answer 1

Это связано с тем, что WebCore предназначено для работы только в одном потоке.

В вашем случае вам надо явно создать этот поток:

new Thread(() => WebCore.Run()) {
    Name = "Awesomium control thread",
    IsBackground = true,
}.Start();

Любую работу с Awesomium надо передавать в этот поток:

WebCore.QueueWork(() => {
    var webView = WebCore.CreateWebView(1920, 1080);
    webView.Source = new Uri("http://google.com");
    // ...
});

Отмечу, что крутить цикл в ожидании загрузки означает убить всю многопоточность. Надо подписываться на события:

var tcs = new TaskCompletionSource<object>();
WebCore.QueueWork(async () => {
    using(webView = WebCore.CreateWebView(1920, 1080)) {
        webView.Source = new Uri("http://google.com");
        webView.LoadingFrameComplete += (o, e) => {
            if (!webView.IsLoading) tcs.TrySetResult(null);
        };
        webView.LoadingFrameFailed += (o, e) => {
            tcs.TrySetException(new Exception(e.ErrorDescription));
        };
        await tcs.Task;
    }
});
// теперь чтобы дождаться окончания загрузки страницы можно использовать await tcs.Task или tcs.Task.Wait();
READ ALSO
Есть ли право на запись файла?

Есть ли право на запись файла?

Есть файл, точнее - его полный путь к файлуМожно ли узнать, есть ли право на запись файла?

319
Не могу разобраться с условием. LINQ

Не могу разобраться с условием. LINQ

Нужно найти все значение c, если значение value равно 5

298
Движение платформы вместе с персонажем

Движение платформы вместе с персонажем

Пытаюсь делать через setparent

460
Отключение чат бота

Отключение чат бота

Решил попробовать написать чат бота для Twitch'a Писал по уроку в видеоВроде как сделал всё, как надо: приложение создал, связал с аккаунтом, токен...

427