如何创建第二个线程,每隔5秒调用一次按钮

时间:2014-08-27 19:08:46

标签: c# multithreading winforms

目标是从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;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

private Timer _timer = new Timer(state => button1_Click(this, new EventArgs(), null, 1, 5000);

对于实际工作线程使用,例如Background WorkerTask

答案 1 :(得分:0)

您可以轻松地使用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();
}