C#中的多线程使用 – Thread 类: 使用回调函数从一个线程中检索数据
public delegate void TrackInfoCallBackDelegate(List<VehicleGPSInfo> trackInfo); //回调委托
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 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()
{
//get data from db
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); // 通过委托, 将数据回传给回调函数
}
}
public class VehicleGPSInfo
{
public VehicleGPSInfo(int _uid, DateTime _gpsTime, double _lat, double _lng, short _speed, short _angle, short _fuelValue, uint _status)
{
this.uid = _uid;
this.gpsTime = _gpsTime;
this.lat = _lat;
this.lng = _lng;
this.speed = _speed;
this.angle = _angle;
this.fuelValue = _fuelValue;
this.status = _status;
}
int uid { get; set; }
DateTime gpsTime { get; set; }
double lat { get; set; }
double lng { get; set; }
short speed { get; set; }
short angle { get; set; }
short fuelValue { get; set; }
uint status { get; set; }
}