Ejemplo n.º 1
0
 public static GlobalDataUtil GetInstance()
 {
     if (_instance == null)
     {
         lock (obj)
         {
             if (_instance == null)
             {
                 _instance = new GlobalDataUtil();
             }
         }
     }
     return(_instance);
 }
Ejemplo n.º 2
0
        /// <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);
            }
        }