-
-
Save amaitland/9ac0ab4ae83b8299d166 to your computer and use it in GitHub Desktop.
CefSharp.OffScreen.ChromiumWebBrowser Parallel Screenshot Crash
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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