C#如何有效地等待x秒

时间:2016-01-26 03:24:52

标签: c#

我的算法会自动填充特定网站中的元数据(使用webBrowser)。在填充元数据之后,算法按下按钮发送(在网站中),它必须等待几秒钟才能在继续之前分析元数据(这不是算法的一部分,而是网页)。问题是我无法知道元数据分析完成的时间。我尝试下一个代码,用于在继续进程之前等待完全加载的网页:

webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

但是没用的因为元数据分析与网页加载无关。

所以,因为元数据分析需要大约20-40秒,我认为等待大约60秒并继续是一个很好的解决方案。我试试:

System.Threading.Thread.Sleep(60000);

以编程方式按下“发送”按钮,但是对于任何原因,在按下按钮之前等待60秒。

2 个答案:

答案 0 :(得分:0)

我不认为我完全理解为什么你想要做你在这里要求的事情,所以我试图回答这个问题我在这里有什么信息。

如果您在事件处理程序中调用Thread.Sleep(例如,Button的点击事件的事件处理程序),Thread.Sleep将有效暂停该程序,因为您&# 39;仍然在UI线程上。我猜这不是你之后的事情吗?

如果您希望UI线程继续(您可能正在完成大部分工作),那么您需要使Button的点击处理程序异步,并使用{{1相反。您可以在此处查看正在使用的模式:Should I avoid 'async void' event handlers?

此外,您可以找到一种方法,使用此处详述的技术回调您的应用程序:http://www.codeproject.com/Articles/35373/VB-NET-C-and-JavaScript-communication

使用这种方法,我确信你可以完全摆脱等待。

答案 1 :(得分:0)

我知道在这种情况下使用异步操作是一个非常好的选择。但我会建议另一种方式。

我想这是一个Windows窗体应用,因此您可以使用System.Windows.Forms.Timer来执行此操作。按下发送按钮后,将计时器间隔设置为60000并添加事件处理程序。

首先添加一个名为t的字段,以便所有实例方法都可以访问它。

Timer t = new Timer();

然后,

//code to press the send button here
t.Interval = 60000;
t.Tick += DoStuff;
t.Start();

事件处理程序是这样的:

private void DoStuff (object sender, EventArgs e) {
    t.Stop();
    //Do whatever you want here
}

如果您不使用Windows窗体,则应使用System.Timers.Timer(类似于Windows窗体)或System.Threading.Timer(这更难使用)。你可以在这里阅读文档:

System.Timers.Timerhttps://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx

System.Threading.Timerhttps://msdn.microsoft.com/en-us/library/system.threading.timer(v=vs.110).aspx