3

我正在尝试渲染一个 html 代码以将其导出为图像,然后使用该图像将其放入 pdf 文档中。我在一个 asp.net/C# Web 应用程序中做所有事情。我遇到的问题是,当我不止一次这样做时,它会给我这个错误:

You are attempting to re-initialize the WebCore. The WebCore must only be initialized once per process and must be shut down only when the process exits.

这是我的代码:

WebCore.Initialize(new WebConfig(), false);
using (WebView webView = WebCore.CreateWebView((pdfWidth - 80).ToString().ToInt() + 20, (pdfHeight / 2).ToString().ToInt() + 20))
{
    webView.LoadHTML(html);

    while (webView.IsLoading || !webView.IsDocumentReady)
                WebCore.Update();

    Thread.Sleep(1100);
    WebCore.Update();

    string fileName = Server.MapPath("result." + DateTime.Now.Second.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Millisecond.ToString() + ".png");
    BitmapSurface surface = (BitmapSurface)webView.Surface;
    surface.SaveToPNG(fileName, true);

    WebCore.Shutdown();
}

我想我无法在每次网页渲染时都初始化 WebCore,所以我把它放在 Global.asax 中。这样做之后,当我调试时,又出现了另一个错误:

Attempted to read or write protected memory. This is often an indication that other memory is corrupt. The current thread is not currently running code or the call stack could not be obtained.

有什么想法我该怎么做?

谢谢

4

2 回答 2

4

简短的回答:是的,你可以。

但是根据WebCore文档

请注意,Awesomium 和 Awesomium.NET 不是线程安全的。所有 API 成员都应该从初始化 WebCore(请参阅 Initialize(WebConfig))或创建第一个 WebView、WebSession 或技术特定 WebControl 的线程调用。

另请查看方法描述Exceptions部分:WebCore.Update()

System.AccessViolationException - 您试图从创建 WebCore 的线程以外的线程访问成员。

因此,考虑到 Web 应用程序中的每个请求通常都在不同的线程中处理,AccessViolationException这是一个文档化的特性

因此,您的任务是保证所有 Awesomium 调用都将在一个特殊的专用线程中处理。线程应该存在于应用程序级别,并且它的访问必须在请求之间共享。从技术上讲,您需要编写一种消息循环或同步上下文,您将能够在其中推送您的delegate,ActionFunc使用 Awesomium 代码以仅在此线程中提供其执行。

于 2013-11-27T23:06:25.783 回答
0

可能您需要调用 webview.invoke 或 webview.begininvoke 并且您将需要创建一个委托来访问在另一个线程中的 webcore.initialize 之前创建的 webview,我将使用单例模式来使用相同的 webview实例。

于 2017-07-30T01:48:33.250 回答