C#中的多线程使用 -- Thread 类: 使用回调函数从一个线程中检索数据
2011-06-21 14:58
537 查看
下面为一个完整的实例:
按照上面的例子, 在实际应用中一个比较复杂的示例如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace conThreadCallBack { class Program { static void Main(string[] args) { Program pro = new Program(); ThreadWithState tws = new ThreadWithState("你好吗?", pro.ResultCallBack); Thread th = new Thread(tws.ThreadProc); th.Start(); Console.WriteLine("主线程: 开始执行, 等待新线程 ..."); th.Join(); //等待线程 th 执行完毕后, 再执行主线程中的后面的语句. Console.WriteLine("主线程: 新线程执行完毕."); Console.ReadKey(); }// 回调方法 private void ResultCallBack(string message) { Console.WriteLine("主线程: 传回的消息: {0}", message); } } public delegate void CallBackDelegate(string message); public class ThreadWithState { private string Message; // 回调委托 private CallBackDelegate callback; // 构造函数 public ThreadWithState(string message, CallBackDelegate callbackDelegate) { this.Message = message; this.callback = callbackDelegate; } // 线程方法 public void ThreadProc() { Console.WriteLine("新线程: 开始执行 .."); Console.WriteLine("新线程: 传入的消息: {0}", Message); if (callback != null) callback("谢谢, 我很好呀!"); // 通过委托, 将数据回传给回调函数 } } }
按照上面的例子, 在实际应用中一个比较复杂的示例如下:
public partial class FormMain : Form { ... // 获取轨迹数据(当天) : 使用线程处理, 有传入参数和 返回数据(委托回调) private void btnGetTrack_Click(object sender, EventArgs e) { int userid = (int)txtTrackRecUserID.Tag; DateTime startTime = DateTime.Today; DateTime endTime = DateTime.Now; CallBackTrackInfo callInfo = new CallBackTrackInfo(userid, startTime, endTime, UpdateTrackInfoList); Thread getTrackThread = new Thread(callInfo.ThreadProc); getTrackThread.Start(); //getTrackThread.Join(); // 等返回数据后 } private void UpdateTrackInfoList(List<VehicleGPSInfo> trackInfo) // 回调委托获得数据 { listViewTrackRec.Clear(); for (int i = 0; i < trackInfo.Count; i++) { VehicleGPSInfo recItem = trackInfo[i]; ListViewItem item = listViewTrackRec.Items.Add(recItem.GpsTime.ToString()); item.Name = recItem.ID.ToString(); item.SubItems.Add(String.Format("{0}, {1}", recItem.Lng, recItem.Lat)); item.SubItems.Add(recItem.Speed.ToString()); item.SubItems.Add(recItem.Direction); } } } public delegate void TrackInfoCallBackDelegate(List<VehicleGPSInfo> trackInfo); //回调委托 public class CallBackTrackInfo // 带返回数据类 { private int UserID; private DateTime StartTime; private DateTime EndTime; List<VehicleGPSInfo> TrackInfo= null; // 回调委托 private TrackInfoCallBackDelegate callback; // 构造函数 public CallBackTrackInfo(int userid, DateTime startTime, DateTime endTime, TrackInfoCallBackDelegate callbackDelegate) { this.UserID = userid; this.StartTime = startTime; this.EndTime = endTime; this.callback = callbackDelegate; } // 线程方法: 连接数据库, 比较费时 public void ThreadProc() { DataTable dt = DalClass.getDbMinuteMile(this.StartTime.ToString(), this.EndTime.ToString(), this.UserID); int recCount = dt.Rows.Count; if (recCount == 0) return; if (recCount > 3500) { string message = String.Format("在选定时间段内的轨迹个数超出3500个,无法进行回放.\n" + "目前轨迹个数为:{0:d}个,请缩小回放轨迹的时间段,以减少回放轨迹个数.", recCount); MessageBox.Show(message); return; } TrackInfo = new List<VehicleGPSInfo>(); DataRow row = null; for (int i = 0; i < recCount; i++) { row = dt.Rows[i]; int uid = Convert.ToInt32(row["gpda_user_id"]); DateTime gpsTime = Convert.ToDateTime(row["gpda_datetime"]); double lat = Convert.ToDouble(row["gpda_latitude"]); double lng = Convert.ToDouble(row["gpda_longitude"]); short speed = Convert.ToInt16(row["gpda_speed"]); short angle = Convert.ToInt16(row["gpda_course"]); short fuelValue = Convert.ToInt16(row["gpda_alarm"]); uint status = Convert.ToUInt32(row["gpda_status"]); VehicleGPSInfo recItem = new VehicleGPSInfo(uid, gpsTime, lng, lat, speed, angle, fuelValue, status); TrackInfo.Add(recItem); } if (callback != null) callback(TrackInfo); // 通过委托, 将数据回传给回调函数 } }
相关文章推荐
- C#中的多线程使用 -- Thread 类: 使用回调函数从一个线程中检索数据
- C#中的多线程使用 -- Thread 类: 使用回调函数从一个线程中检索数据
- C# 多线程开发 1:使用 Thread 类创建与启动线程
- C# 多线程编程 - 使用Thread类创建线程
- [C#学习笔记之多线程1]使用ParameterizedThreadStart委托向线程函数传送参数
- C#中的线程(三) 使用多线程
- 使用回调函数实现socket服务器端子线程刷新UI数据(socket通信第三弹)
- [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
- c# 多线程的使用-为线程传递参数
- C# 线程知识--使用ThreadPool执行异步操作
- C#构建多线程应用程序(1) —— 使用委托来自动创建次线程以实现异步方法的调用
- C#中的线程(三) 使用多线程
- C# 线程手册 第五章 扩展多线程应用程序 在C#中使用线程池
- 多线程 : 使用 Exchanger 两个线程间交换数据(一手交钱一手交货)
- 第一个WPF学习例子--多线程、任务和UI线程一起使用、方法重载 c#书籍
- C#使用进度条,并用线程模拟真实数据 ProgressBar用法(转)
- c# 上传excel数据总结(一)线程的使用
- JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没
- !!c# 委托与多线程 -- 相比background来说,本方法针对当需要通过异步代理发起UI操作,而后线程中进行sleep操作的时使用
- BOOST 库 thread类线程使用 多线程处理的理解