public static GlobalDataUtil GetInstance() { if (_instance == null) { lock (obj) { if (_instance == null) { _instance = new GlobalDataUtil(); } } } return(_instance); }
/// <summary> /// 使用CEFSharp来抓取(支持多次跳转的页面) /// 需要连续且快速抓取不是动态跳转的页面,推荐使用HttpWebRequest类 /// </summary> /// <param name="uIElement"></param> /// <param name="url"></param> /// <param name="timeout"></param> /// <returns></returns> public static async Task <string> GetDynamicHtmlSourceWithChromium(System.Windows.UIElement uIElement, string url, int timeout = 10000) { //CEF使用参见 https://github.com/cefsharp/CefSharp/wiki //这里不对ChromiumWebBrowser做任何设置 //真实生产环境需要对ChromiumWebBrowser做相关配置 //CEF初次打开页面会慢,给10秒超时时间 var source = ""; try { await Task.Run(() => { uIElement.Dispatcher.Invoke(() => { GlobalDataUtil.GetInstance().Browser.GetHtmlSourceDynamic(url, ChromiumWebBrowserLoadEnd); }); while (true) { var waitResult = chromeAutoResetEvent.WaitOne(timeout); if (waitResult == true) { uIElement.Dispatcher.Invoke(async() => { source = await GlobalDataUtil.GetInstance().Browser.GetHtmlSource(); }); } else { //这里目前只能借助等待超时来做,因为不知道动态页面会跳转多少次 //正常访问时,跳转会比较快,最后一次需要等待设置的超时时间 //超时后直接返回 //如果不是需要多次跳转的页面,可以把while去掉,只等待一次 break; } } }); return(source); } catch { return(source); } }