Skip to content

Instantly share code, notes, and snippets.

@amaitland
Forked from campersau/AccessViolationException
Last active February 19, 2016 01:22
Show Gist options
  • Save amaitland/9ac0ab4ae83b8299d166 to your computer and use it in GitHub Desktop.
Save amaitland/9ac0ab4ae83b8299d166 to your computer and use it in GitHub Desktop.
CefSharp.OffScreen.ChromiumWebBrowser Parallel Screenshot Crash
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CefSharp.OffScreen;
using System.Drawing;
using System.Drawing.Imaging;
namespace CefSharp.Offscreen.ScreenshotTest
{
class Program
{
static Program()
{
var settings = new CefSettings();
settings.WindowlessRenderingEnabled = true;
if (!Cef.Initialize(settings))
{
Console.WriteLine("Failed to initialize Cef");
}
}
static void Main(string[] args)
{
Run();
Console.ReadKey();
Cef.Shutdown();
}
static async Task Run()
{
Size size = new Size(100, 100);
IEnumerable<Task> tasks = Enumerable.Range(0, 10).Select(i =>
{
return Task.Run(async () =>
{
Console.WriteLine("Create image: " + i);
Bitmap image = await CreateImage("<!doctype html><html><head></head><body>" + i + "</body></html>", size);
Console.WriteLine("Finished image: " + i);
string filename = Guid.NewGuid().ToString("N") + ".png";
image.Save(".\\" + filename, ImageFormat.Png);
});
});
await Task.WhenAll(tasks);
Console.WriteLine("Finished processing all tasks");
}
static async Task<Bitmap> CreateImage(string html, Size size)
{
var settings = new BrowserSettings();
settings.WindowlessFrameRate = 1;
using (var chromium = new ChromiumWebBrowser(browserSettings: settings))
{
chromium.Size = size;
var tcs = new TaskCompletionSource<bool>();
EventHandler<LoadingStateChangedEventArgs> loadingHandler = null;
loadingHandler = new EventHandler<LoadingStateChangedEventArgs>((object sender, LoadingStateChangedEventArgs e) =>
{
if (!e.IsLoading)
{
chromium.LoadingStateChanged -= loadingHandler;
tcs.TrySetResult(true);
}
});
chromium.LoadingStateChanged += loadingHandler;
EventHandler initializedHandler = null;
initializedHandler = new EventHandler((object sender, EventArgs e) =>
{
chromium.BrowserInitialized -= initializedHandler;
chromium.LoadHtml(html, "http://localhost");
});
chromium.BrowserInitialized += initializedHandler;
await tcs.Task;
return await chromium.ScreenshotAsync();
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment