2014-08-27 68 views
-6

目标是从webservice收集股票信息,并将其存储在列表中。 *创建第二个线程,每5秒调用一次按钮点击事件*继续更新如何创建第二个线程,每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; 
     } 
    } 
} 
+0

Web服务:http://www.webservicex.net/stockquote.asmx?WSDL – user3853658 2014-08-27 19:11:57

+3

为什么要叫'button1_click'?不能直接调用'GettingData'吗? – Vland 2014-08-27 19:12:15

+0

雅甚至从第二个线程调用GettingData方法应该是好的 – user3853658 2014-08-27 19:15:59

回答

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

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

+0

谢谢,但我想知道以多线程方式尝试它..我不知道它的多线程 – user3853658 2014-08-27 19:17:52

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(); 
} 
+0

谢谢你会尝试这个..你能告诉我我怎么去用多线程的方式。继续使用第二个线程更新 – user3853658 2014-08-27 19:19:54