我会尽量让这个问题变得简单,这样就可以很容易地了解这个场景。我正在尝试为学校项目构建一个与股票相关的应用程序,该应用程序正在从网络上获取特定股票的数据。因此,用户在文本框中输入股票名称,单击按钮后,股票名称将传递给下载该特定股票数据的方法。现在我希望每秒为同一股票调用该方法,以便用户可以获得最新更新。到现在都没有问题。但是当用户想要监控不止一只股票时,我需要深入研究线程。对于每只股票,每秒都会有一个线程调用更新股票方法。例如,有 5 只股票,所以应该有 5 个线程同时工作,每秒调用该方法来更新结果。
为此,我在按钮单击事件中使用 System.Threading.Timer,它正在调用库存更新方法。但问题是,当我输入第一只股票时,该方法只被调用了 2 次,第二只股票被调用了 6 次,第三只股票被调用了 12 次以上。这种奇怪行为背后的原因是什么。
任何想法是否有任何其他方法可以实现我想要做的事情。以下是我正在处理的代码。
private void button1_Click(object sender, EventArgs e)
{
dataGridView1.Rows.Add("","","","","","test", "test");
int i= dataGridView1.Rows.Count - 1;
string stock = textBox1.Text + ":"+i;
System.Threading.Timer tmr = new System.Threading.Timer(Tick,stock,1000,2000);
}
public void Tick(object stock)
{
lock (locker)
{
string maindata = stock.ToString();
string[] testing = maindata.Split(':');
byte[] data = null;
Uri uri = new Uri("some url where i am getting data from");
WebClient wc = new WebClient();
wc.DownloadDataCompleted += delegate(object sender, DownloadDataCompletedEventArgs e)
{
data = e.Result;
};
wc.DownloadDataAsync(uri);
while (wc.IsBusy)
{
Thread.Sleep(100);
}
string strData = Encoding.ASCII.GetString(data);
string[] s = strData.Split('{');
string data1 = s[4];
string[] data2 = data1.Split('}');
string final = "[{" + data2[0] + "}]";
Form1 obj = new Form1();
List<Form1> jarray = JsonConvert.DeserializeObject<List<Form1>>(final);
dataGridView1.Rows[System.Convert.ToInt32(testing[1]) - 1].Cells[0].Value = jarray[0].Symbol;
dataGridView1.Rows[System.Convert.ToInt32(testing[1]) - 1].Cells[1].Value = jarray[0].Ask;
dataGridView1.Rows[System.Convert.ToInt32(testing[1]) - 1].Cells[2].Value = jarray[0].Volume;
dataGridView1.Rows[System.Convert.ToInt32(testing[1]) - 1].Cells[3].Value = jarray[0].Bid;
}
}