关于异步等待的问题,求求大家指点下
我的问题是要把多块表的抄表时间发到单片机上去,现在功能实现,比如我写入一个表具的抄表时间,成功后里面会反馈消息,我根据消息好做下一步处理,现在问题出在这块
if (pCI != null&&model.Comm.ToString().Equals(pCI.PortNum.ToString()))
{
Tools.ShowContentHint(string.Format("采集串口 " + pCI.PortNum.ToString() + " 开始初始化抄表 CDT编号:{0} 安装序号{1}",model.CdtNum,model.SerialNo));
// 等待通道可利用
while (!pCI.IsAvailable)
{
Thread.Sleep(1000 * Config.SendInterval);
}
pCI.IsAvailable = false;
pCI.SPUnit.WaitEvent.Reset();
pCI.SPUnit.SendData(InstructionSet.GetInitReadTimeCommandCmd(cdt, meter, model));
if (!pCI.SPUnit.WaitEvent.WaitOne(6000, false))
{
#region
// 我的想法是发送后让线程等待6S,如果6S后还没接收完或没反馈就当超时处理,跟踪是有反馈的,就是进不来。
// 我修改为WaitOne(-1, false)为无限等待也不行,主要对这WaitOne不理解,查了资料还不明白,所以请教大侠
string pReturnStr = InstructionSet.ByteToHexString(pCI.SPUnit.pbReceiveArr, true);
#endregion
}
else
{
Tools.ShowContentHint(string.Format("采集串口 " + pCI.PortNum.ToString() + " CDT编号:{0} 安装序号{1} 无应答反馈", model.CdtNum, model.SerialNo));
}
pCI.IsAvailable = true;
}
#endregion
}
pCI.SPUnit.CloseComm();
}
============================================================= 调用部分=================================================================
/// <summary>
/// 发送抄表配置信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSendPlan_Click(object sender, EventArgs e)
{
#region
if (this.dgvPlan.CurrentRow != null)
{
int planId = PublicBasis.DataTypeHelper.GetInt(this.dgvPlan.CurrentRow.Cells["CPlanID"].Value);
List<M_PlanDetail> details = new SC.SSH.BLL.BLLM_PlanDetail().GetModelList(string.Format("PlanId={0} and IsSend=0", planId));
IList<string> comms = new List<string>();
foreach (SC.SSH.Model.M_PlanDetail model in details)
{
if (!comms.Contains(model.Comm.ToString()))
{
comms.Add(model.Comm.ToString());
}
}
// 初始化串口实例
foreach (string comm in comms)
{
SerialPortUnit serialPort = new SerialPortUnit("COM" + comm);
Task pCI = new Task();
pCI.PortNum = DataTypeHelper.GetInt(comm);
pCI.SPUnit = serialPort;
pCI.details = details;
// 异步初始化抄表时间
NewTaskDelegate pInitTime = new NewTaskDelegate(InitTime);
IAsyncResult pInitTimeResult = pInitTime.BeginInvoke(pCI, null, null);
}
}
else
{
MessageBox.Show("请选择需要发送的计划");
}
#endregion
}
====================================================================这是我封装的一个任务类===================================================
/// <summary>
/// 抄表任务
/// </summary>
public class Task
{
/// <summary>
/// 串口号
/// </summary>
public int? PortNum=null;
/// <summary>
/// 串口对象类
/// </summary>
public SerialPortUnit SPUnit;
/// <summary>
/// 计划从表
/// </summary>
public IList<M_PlanDetail> PlanDetails;
/// <summary>
/// 广播校时时间:00:10:00
/// 当校时完毕后修改广播校时时间为下一天的00:10:00
/// </summary>
public DateTime BroadCastTime = PublicBasis.DataTypeHelper.GetDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:10:00")).AddDays(1);
/// <summary>
/// 下次读表时间,此时间是后台定时轮训时间
/// 和抄表计划中的时间不同
/// </summary>
public DateTime NextTime = DateTime.Now;
/// <summary>
/// 下次轮训报警时间
/// </summary>
public DateTime NextCheckWaringTime = DateTime.Now;
/// <summary>
/// 串口是否可用
/// </summary>
public bool IsAvailable = true;
/// <summary>
/// 当前抄码对象
/// </summary>
public CurrPlanDetail CurrPlanDetail;
/// <summary>
/// 初始化CurrPlanDetail
/// </summary>
/// <returns></returns>
public CurrPlanDetail InitCurrPlanDetail(M_PlanDetail model)
{
CurrPlanDetail cpd = new CurrPlanDetail();
PublicBasis.DataTypeHelper.Clone(cpd.planDetail, model);
return cpd;
}
/// <summary>
///
/// </summary>
public List<M_PlanDetail> details;
public List<M_ControlPlanDetail> M_ControlPlanDetails;
}
}