下面是我的代码。在调试模式下检查,发现程序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
答案 0 :(得分:0)
在STAThread
上打Main
不会使您的线程成为STA线程。它会将 mark 标记为STA线程,但是将使其成为STA线程则取决于您。
具体来说,您需要执行某种形式的Win32消息泵送。最简单的方法是使用WPF Dispatcher。还有一些方法可以使用Windows窗体类型使其工作。或者,您可以编写自己的消息泵。
顺便说一句,此评论有误导性,因为实际的超时时间是27小时46分钟40秒-而不是“ 10s”:
var cts = new CancellationTokenSource(100000000); // cancel in 10s