Go homepage(回首页) Upload pictures (上传图片) Write articles (发文字帖)
The author:(作者)delvpublished in(发表于) 2014/1/10 6:30:24 使用.NET多线程技术显示实时股票信息_[Asp.Net教程]
激活图形 下一步,导入下面的名字空间(在代码窗口的顶部):Imports SoftwareFX.ChartFXImports System.Threading 定义用于线程的全局变量t1:Dim t1 As Thread 在Chart1_Load事件中,初始化Chart组件:Private Sub Chart1_Load(ByVal sender As _System.Object, ByVal e As System.EventArgs) Handles Chart1.Load 'x轴上每隔5点显示时间 Chart1.AxisX.Step = 5 '每个点之间用5象素间隔 Chart1.AxisX.PixPerUnit = 5 '使图表可以滚动 Chart1.Scrollable = True '打开和关闭通讯管道 Chart1.OpenData(COD.Values, 1, COD.Unknown) Chart1.CloseData(COD.Values)End Sub 给当前的窗体添加一个叫做StockQuote的类。StockQuote类调用前面的Web服务并用返回的股票价格来更新图表。Public Class StockQuote '组件中图形的数量 Const NUM_SERIES = 1 Private lastPoint As Integer = 0 Dim stockPrice As Single Private pStockSymbol As String Private pStockSeries As Integer = 0 Private pChartControl As Chart WriteOnly Property StockSymbol() Set(ByVal Value) pStockSymbol = Value End Set End Property WriteOnly Property ChartControl() Set(ByVal Value) pChartControl = Value End Set End Property Public Sub InvokeWebService() Dim ws As New StockWS.Service1 For i As Integer = 0 To 10000 stockPrice = ws.getPrice(pStockSymbol) pChartControl.Invoke(New _myDelegate(AddressOf updateChart), New Object() {}) '继续之前等待1秒钟 Thread.Sleep(1000) Next End Sub Public Delegate Sub myDelegate() Public Sub updateChart() pChartControl.OpenData(COD.Values, NUM_SERIES, COD.Unknown) pChartControl.Value(pStockSeries, lastPoint) = stockPrice '显示x轴上的时间 pChartControl.AxisX.Label(lastPoint) = DateTime.Now.ToShortTimeString lastPoint += 1 pChartControl.CloseData(COD.Values) '把滚动条移到最右边 pChartControl.AxisX.ScrollPosition = pChartControl.AxisX.ScrollSize End SubEnd Class 你通过StockSymbol属性把需要的股票编码传递给StockQuote类,并使用ChartControl属性设置图表更新。InvokeWebService()方法在循环(示例中设置为10,000)中周期性地调用上面的Web服务。由于这个类会在一个单独的线程中执行,你必须非常小心以确保自己不会自动地更新某个Windows控件,因为Windows控件并不是线程安全的(thread-safe)。作为代替,你必须使用委托并调用自己希望更新的控件上的Invoke()方法。代码每秒钟调用Web服务一次,这是由Thread.Sleep(1000)语句设置的。 为了启动线程用最新的股票信息更新图表,给"获取股票报价"按钮的点击(Click)事件增加下面的代码:Private Sub btnGetStockQuote1_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles btnGetStockQuote1.Click Dim sq As New StockQuote sq.StockSymbol = cmbStocks1.SelectedItem sq.ChartControl = Chart1 t1 = New Thread(AddressOf sq.InvokeWebService) t1.Start()End Sub 把调用该Web服务的代码打包为一个类的主要原因是Thread类构造函数只能接受一个ThreadStart委托(启动线程的方法的委托),不存在可以接受多个参数值的重载的Thread.Start()方法。因此,把多个参数传递到一个线程中的唯一途径是把调用的相关代码打包为一个类,接着你就可以通过这个类的参数来传递参数。 按F5测试这段代码,选择一只股票并点击"获取股票报价"按钮。你现在可以移动窗口了(即UI并没有被重复的Web服务调用锁死),并且同时可以看到图表一直在用最新的股票信息更新(图5所示)。
显示多只股票的价格 你已经看到了如何在保证应用程序的UI不停顿的情况下异步地调用Web服务了;但是,你还可以增强该应用程序来同时显示多个信息。 在同一个窗体中,增加另一组控件(ChartFX、组合框和按钮)和标签、暂停、停止按钮(如图6所示)。
赞