c#控制台应用程序Web浏览器TaskCompletionSource暂停控制台应用程序

时间:2020-06-10 11:17:22

标签: c# console-application

下面是我的代码。在调试模式下检查,发现程序tcs.Task在等待namespace WebBrowserConsole2 { class Program { [STAThread] static void Main(string[] args) { SetFeatureBrowserEmulation(); Program objpro = new Program(); objpro.CallDynamicPage(); } async public void CallDynamicPage() { try { var cts = new CancellationTokenSource(100000000); // cancel in 10s var html = await LoadDynamicPage("mysiteURL", cts.Token); MessageBox.Show(html.Substring(0, 1024) + "..."); // it's too long! } catch (Exception ex) { Console.WriteLine(ex.Message); } } async Task<string> LoadDynamicPage(string url, CancellationToken token) { WebBrowser webBrowser = new WebBrowser(); var tcs = new TaskCompletionSource<bool>(webBrowser); WebBrowserDocumentCompletedEventHandler handler = (s, arg) => tcs.TrySetResult(true); try { using (token.Register(() => tcs.TrySetCanceled(), useSynchronizationContext: true)) { webBrowser.DocumentCompleted += handler; try { webBrowser.ScriptErrorsSuppressed = true; webBrowser.Navigate(url); await tcs.Task; // execution stops here. and programs ends here } catch (Exception exTask) { Console.WriteLine("exTask-> " + exTask.ToString()); } finally { webBrowser.DocumentCompleted -= handler; } } } catch (OperationCanceledException exc) { } var documentElement = webBrowser.Document.GetElementsByTagName("html")[0]; var html = documentElement.OuterHtml; while (true) { await Task.Delay(500, token); if (webBrowser.IsBusy) continue; var htmlNow = documentElement.OuterHtml; if (html == htmlNow) break; html = htmlNow; } token.ThrowIfCancellationRequested(); return html; } static void SetFeatureBrowserEmulation() { if (LicenseManager.UsageMode != LicenseUsageMode.Runtime) return; var appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", appName, 11000, RegistryValueKind.DWord); } } } 时暂停。 相同的代码可以很好地运行winform应用程序,并提供完全加载的html页面。在控制台应用程序中尝试相同。

sed -E '1{x;s/^/cat file2/e;x};G;s/^(\S+)(\n.*)*\n([^\n]*\<\1\>[^\n]*).*/\1 \3/;P;d' file1

1 个答案:

答案 0 :(得分:0)

STAThread上打Main不会使您的线程成为STA线程。它会将 mark 标记为STA线程,但是使其成为STA线程则取决于您。

具体来说,您需要执行某种形式的Win32消息泵送。最简单的方法是使用WPF Dispatcher。还有一些方法可以使用Windows窗体类型使其工作。或者,您可以编写自己的消息泵。

顺便说一句,此评论有误导性,因为实际的超时时间是27小时46分钟40秒-而不是“ 10s”:

var cts = new CancellationTokenSource(100000000); // cancel in 10s