【问题标题】:How do I create second thread which will call button click every 5sec如何创建第二个线程,该线程将每 5 秒调用一次按钮单击
【发布时间】:2014-08-28 03:22:45
【问题描述】:

目的是从 webservice 收集股票信息,将其存储在列表中。 * 创建第二个线程,每 5 秒调用一次按钮点击事件 * 保持更新

如何创建第二个线程以每 5 秒调用一次按钮单击事件?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.Threading;

namespace StockList
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // class with stock values declared as properties
        class StockClass
        {
            public string Symbol { get; set; }
            public string Last { get; set; }
            public string Date { get; set; }
            public string Time { get; set; }
            public string Change { get; set; }
            public string Open { get; set; }
            public string High { get; set; }
            public string Low { get; set; }
            public string Volume { get; set; }
            public string MktCap { get; set; }
            public string PreviousClose { get; set; }
            public string PercentageChange { get; set; }
            public string AnnRange { get; set; }
            public string Earns { get; set; }
            public string PE { get; set; }
            public string Name { get; set; }
        }

        //storing each stock data in a StockList
        List<StockClass> StockList = new System.Collections.Generic.List<StockClass>();

        //button will call GettingData method
        public void button1_Click(object sender, EventArgs e)
        {
            GettingData();
        }

        /*GettingData method gets data from webservice, converts string to xml and stored
              in object myStock of type Stock */
        public void GettingData()
        {
            ServiceReference1.StockQuoteSoapClient client = new ServiceReference1.StockQuoteSoapClient("StockQuoteSoap");
            string result = client.GetQuote(textBox1.Text);
            System.Data.DataTable dataTable = new DataTable();
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(result);
            XmlNodeList nodes = xmlDoc.SelectNodes("/StockQuotes/Stock");
            foreach (XmlNode xm in nodes)
            {
                var myStock = new StockClass()
                {
                    Name = xm["Name"].InnerText,
                    Low = xm["Low"].Value,
                    Symbol = xm["Symbol"].InnerText,
                    Last = xm["Last"].InnerText,
                    Date = xm["Date"].InnerText,
                    Time = xm["Time"].InnerText,
                    Change = xm["Change"].InnerText,
                    Open = xm["Open"].InnerText,
                    High = xm["Open"].InnerText,
                    Volume = xm["Volume"].InnerText,
                    MktCap = xm["MktCap"].InnerText,
                    PreviousClose = xm["PreviousClose"].InnerText,
                    PercentageChange = xm["PercentageChange"].InnerText,
                    AnnRange = xm["AnnRange"].InnerText,
                    Earns = xm["Earns"].InnerText,
                    PE = xm["P-E"].InnerText,
                };
                StockList.Add(myStock);
            }
            lblCompanyName.Text = StockList[StockList.Count - 1].Name;
        }
    }
}

【问题讨论】:

  • 为什么要调用button1_click?不能直接调用GettingData吗?
  • 你甚至从第二个线程调用 GettingData 方法应该没问题

标签: c# multithreading winforms


【解决方案1】:

您可以轻松地使用Timer 以 5 秒的间隔调用该方法,您所要做的就是创建一个具有所需计时器间隔的计时器实例,并在 Elapsed 事件中调用需要为每个5 秒。

Place this code within Form's constructor

public Form1()
{
  Timer timer = new Timer() { Enabled = true, Interval = 5000 };
  timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
  timer.Start();
}

Also add the following event to your form

private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
  GettingData();
}

【讨论】:

  • 谢谢你会试试这个..你能告诉我如何以多线程方式使用它。使用第二个线程继续更新
【解决方案2】:
private Timer _timer = new Timer(state => button1_Click(this, new EventArgs(), null, 1, 5000);

对于真正的工作线程,例如使用Background WorkerTask

【讨论】:

  • 谢谢,但我想以多线程方式尝试它。我不确定它是否是多线程
猜你喜欢
  • 1970-01-01
  • 2021-01-22
  • 2021-12-18
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
相关资源
最近更新 更多