您的问题是使用专为 Web 服务器上的 UI 应用程序设计的控件。我认为您将需要使用消息循环来让浏览器“做事”,然后在您将 ASP.NET 请求返回给桌面浏览器之前返回给您。
本质上,该技术是基于创建一个新的控件类System.Windows.Forms.ApplicationContext
,然后ApartmentState
在创建该控件时将其设置为 STA。然后它本身包含创建WebBrowser
控件的逻辑。然后你有:
- 执行 ASP 东西的主线程(
Page_Load
等)
- 然后,这使用类似
AutoResetEvent
线程之间的信号
- 它将 AutoResetEvent 传递给您创建的派生控件
- 它会等待以防止它在其他所有操作完成之前返回您的请求
- 第二个线程,
WebBrowser
生活在其中
- 第三个线程用于消息循环,执行
WebBrowser
事件句柄,如Navigating
事件处理程序和我们的回调函数。这是您Set
使用 AutoResetEvent 让主线程向原始调用者返回响应的地方。
然后可以使用创建消息循环System.Windows.Forms.Application.Run(ApplicationContext ctx)
,这避免了需要 Windows 窗体本身来启动 Web 浏览器。
这真的很复杂,但有人已经这样做了:CodePlex: Using the WebBrowser Control in ASP.NET
线程.睡眠
我们现在知道这对您不起作用
尝试使用Thread.Sleep
:
stakeTextboxElement.InnerText = "3";
System.Threading.Thread.Sleep(3000);
webbrowser.Navigate("javascript: placeBet();"); //they use javascript
带/不带复位事件的定时器
这可能与 Thread.Sleep 有相同的问题
如果这不起作用,请在几秒钟后Navigate
使用 a 安排您的通话。Timer
function void DoNavigate(Object stateInfo) {
AutoResetEvent arev = (AutoResetEvent)stateInfo; // *
webbrowser.Navigate("javascript: placeBet();"); //they use javascript
arev.Set(); // *
}
...
stakeTextboxElement.InnerText = "3";
// depending on your scenario you may need to wait for the navigate to happen, so use
// a reset event for this
AutoResetEvent arev = new AutoResetEvent(false); // *
TimerCallback tcb = DoNavigate;
Timer stateTimer = new Timer(tcb, arev, 3000, Timeout.Infinite);
arev.WaitOne(); // *
应用程序.DoEvents
这在 ASP.NET 中并不真正可用,但是如果您使用的是 Windows 窗体(如果您使用的是 Win Forms 或 ASP.NET,我不清楚您的问题)并且应用程序正在冻结 UI,那么您可能需要让它使用Application.DoEvents
.