解决 关于时间睡眠。

已加入
2020年12月21日
留言内容
12
编程经验
Beginner
我正在开发一个窗口表单程序,它将反复从网络上获取信息。该程序基本上是从我使用的控制台程序中复制的
C#:
system.threading.thread.sleep(30*1000)
.
但是,当涉及到窗体程序时,它会使程序变得非常慢。我想要的是数据要一个接一个地输出,但是现在程序似乎已被挂起,然后突然出现了很多行。下面是脚本:
C#:
using System;
using System.Windows.Forms;
using HtmlAgilityPack;
using System.Net;
using System.IO;

namespace AAstockpriceWin
{
    public partial class Form1 : Form
    {
        private static string Currenthtml = @"http://www.aastocks.com/tc/stocks/market/bmpfutures.aspx?future=200300";
        private static string Nexthtml = @"http://www.aastocks.com/tc/stocks/market/bmpfutures.aspx?future=200301";
        public static string Html;
        public static int A=0;
        public Form1()
        {
            InitializeComponent();
        }

        private void txtFilename_TextChanged(object sender, EventArgs e)
        {

        }

        private void rd2_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void rd1_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void btnStartStop_Click(object sender, EventArgs e)
        {
            A++;
            if (rd2.Checked) { Html = Nexthtml; } else { Html = Currenthtml; }
            if (A % 2 == 0) { lbWorkornot.Text = "Stoped"; } else { lbWorkornot.Text = "Working"; }
            while (A % 2 == 1)  <<<<<<<<<<<<<<
            {               
                Info();
            }     
        }
        private void txtResult_TextChanged(object sender, EventArgs e)
        {
          
        }
        private void txtTimeinterval_TextChanged(object sender, EventArgs e)
        {
            
        }
        public void Info()
        {

            WebClient httpins = new WebClient();
            httpins.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0");
            httpins.Headers.Add("Method", "GET");

            DateTime now = DateTime.Now;
            Stream resp = httpins.OpenRead(Form1.Html);
            StreamReader resstring = new StreamReader(resp);
            string s = resstring.ReadToEnd();
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(s);
            resstring.Close();
            HtmlNode pricenode = doc.DocumentNode.SelectSingleNode("html/body/form/div[4]/div[1]/div[4]/div[5]/table/tr[1]/td[1]/div[4]");
            HtmlNode pricenow = doc.DocumentNode.SelectSingleNode("html/body/form/div[4]/div/div[4]/div[5]/table/tr[7]/td/div[5]");
            HtmlNode change = doc.DocumentNode.SelectSingleNode("/html/body/form/div[4]/div[1]/div[4]/div[5]/table/tr[1]/td[2]/div[4]/span");// html / body / form / div[4] / div[1] / div[4] / div[5] / table / tbody / tr[1] / td[2] / div[4] / span
            HtmlNode premium = doc.DocumentNode.SelectSingleNode("/html/body/form/div[4]/div[1]/div[4]/div[5]/table/tr[1]/td[3]/div[4]"); //html/body/form/div[4]/div[1]/div[4]/div[5]/table/tbody/tr[1]/td[3]/div[4]             
            txtResult.Text += $"{now.ToString("HH:mm:ss")}\tPrice: {pricenode.InnerText.Trim()}\tPremiun: {premium.InnerText.Trim().Replace("&nbsp23","")}\tChange: {change.InnerText.Trim()}\tPriceN: {pricenow.InnerText.Trim()}\r\n";
            System.Threading.Thread.Sleep(Convert.ToInt32(txtTimeinterval.Text) * 1000); <<<<<<<<<<<<<<<<<<<<
        }       
    }
}
但是一旦循环和
C#:
System.Threading.Thread.Sleep(Convert.ToInt32(txtTimeinterval.Text) * 1000)
被删除,它是如此顺利。
那有什么问题?


感谢您的关注。
 

附件

  • Bad.png
    Bad.png
    313 KB · Views: 3

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,549
地点
弗吉尼亚州切萨皮克
编程经验
10+
WinForms应用程序冻结的原因是因为您将Sleep()调用放在了UI线程上。 UI线程用于使UI保持最新。当您暂停UI线程时,所有更新都将暂停。这就是为什么您应该在应该再次对网站进行ping的时候在UI线程上使用计时器来通知的原因,并且如果ping网站可能需要很长时间,请在另一个线程中执行此操作,以使UI线程不会停留在等待状态用于响应或处理响应。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
Winforms是事件驱动的。事件驱动任务。你的任务在哪里?

这就是为什么您不使用这些事件来进行大量工作的原因,否则您的UI会由于已经说明的原因而锁定。

I can envision using a backgroundworker alone without a timer.
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
进一步;您是否有权刮取该网站?我假设这是您自己的,那么您将使用API​​。

我只想指出: AASTOCKS.com免责声明

订阅者或应用程序/网站访问者同意,未经AASTOCKS.com Limited明确的书面同意,不得以任何方式复制,转发,传播,分发,广播,发布,分发,出售或商业利用本应用程序/网站上的信息和内容。 。

这禁止您在上面做什么。
 
已加入
2020年12月21日
留言内容
12
编程经验
Beginner
天啊。它现在可以正常运行。谢谢。
但是还有一个问题:由于我们现在正在使用计时器,因此我必须等待timer.interval时间,直到该方法实际运行为止。
有什么好主意可以使其立即开始运行?
C#:
private void btnStartStop_Click(object sender, EventArgs e)
        {
            A++;           
            
            if (rd2.Checked) { Html = Nexthtml; } else { Html = Currenthtml; }
            if (A % 2 == 0)
            { lbWorkornot.ForeColor = System.Drawing.Color.Red;
                lbWorkornot.Text = "Stoped";
                timer1.Stop();
                timer1.Tick -= new EventHandler(Info);
            }
            else
            {lbWorkornot.ForeColor=System.Drawing.Color.Green;
                lbWorkornot.Text = "Working";
                timer1.Tick += new EventHandler(Info);
                timer1.Interval = Convert.ToInt32(txtTimeinterval.Text) * 1000;
                timer1.Start(); }                   
      
        }
在哪里 信息 是我要反复运行的方法。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,535
地点
悉尼,澳大利亚
编程经验
10+
Note that, if you're going to do work on a secondary thread anyway, you probably ought to use a System.Timers.Timer rather than a System.Windows.Forms.Timer. The former raises its Elapsed event on a secondary thread by default, while the latter raises its Tick event on the UI thread. That said, if you want to use a BackgroundWorker in order to be able to use its ProgressChanged and/or RunWorkerCompleted events, stick with the System.Windows.Forms.Timer.
 
已加入
2020年12月21日
留言内容
12
编程经验
Beginner
Thanks for everyone. The question so far are solved. Using system.timer.timer seem cant work in different UI in this case. I simply add 信息 (this,null) after the start button triggered.
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,056
地点
挪威
编程经验
10+
在“信息”中,您要设置txtResult.Text,无法在辅助线程中访问UI。最好是从辅助线程中返回处理结果,然后在UI线程中将字符串分配给文本框。
在Forms.Timer中处理处理意味着强烈建议您在UI线程中进行处理。我在第二篇文章中链接到的Async / Await任务显示了正确执行此操作是多么容易。
 
最佳 底部