从后台接受消息 isStart判断是否运行
private void Instance_TopoStart(object sender, string strTaskId, string strStart)
{
isStart = strStart == "0" ? true : false;
}由于前台发一个消息请求状态再收到后台传来的消息有延时,所以不能马上进行处理,
现在的要求是前台要等30秒左右,如果后台还没有传来状态的话就else了,我现在写了一个while语句用i++来处理,有点太不专业化了
while (!isStart && i<600000000)
{
i++;
}
if(isStart)
{
成功
}
else
{
失败
}现在请各位大侠给小弟写一个用线程来处理的这个问题的方法,我是刚工作的新人,线程不会用,非常感谢!!或者用其他方法能处理也可以,只是要专业一点的,呵呵~ 谢谢 !
private void Instance_TopoStart(object sender, string strTaskId, string strStart)
{
isStart = strStart == "0" ? true : false;
}由于前台发一个消息请求状态再收到后台传来的消息有延时,所以不能马上进行处理,
现在的要求是前台要等30秒左右,如果后台还没有传来状态的话就else了,我现在写了一个while语句用i++来处理,有点太不专业化了
while (!isStart && i<600000000)
{
i++;
}
if(isStart)
{
成功
}
else
{
失败
}现在请各位大侠给小弟写一个用线程来处理的这个问题的方法,我是刚工作的新人,线程不会用,非常感谢!!或者用其他方法能处理也可以,只是要专业一点的,呵呵~ 谢谢 !
先让当前线程 sleep 30 秒
然后写一个线程一直收后台消息 如果isStart为真的话立马唤醒当前线程 如果三十秒以后isStart还为假 也要唤醒当前线程 提示失败
我认为逻辑应该是这样,请大侠们指点一下 ,还有线程不会写,郁闷啊,各位路过的帮忙,可以加分,谢谢!
event.WaitOne();然后后来反馈过来了,event.Set();
前台就开始做了,这样就不是延迟的事情了,是由后台来驱动前台了。
或者异步调用后台,定义callback事件也可以做到这点。
{
if (this.lstTask.SelectedIndices.Count == 0)
{
this.ShowErrorMsg("请先选中需要立即执行的任务!");
return;
}
MetarCommonSupport.MsgTransceiver.Instance.SendMessageToTopoToStartTasK(task_id,operate, "0"); 给后台发消息开始执行任务
try
{
long i=0;
while (!isStart && i<60000000) // isStart 定义的是全局变量
{
i++;
}
if (isStart)
{
this.txtStaus.Text = "运行中";
成功
else
{
失败
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
收后台的消息 我定义了一个bool型的全局变量isStart判断是否收到后台消息了 初始的isStart值为false
private void Instance_TopoStart(object sender, string strTaskId, string strStart)
{
isStart = strStart == "0" ? true:false;
}
private void barBtnRun_ItemClick_1(object sender, DevExpress.XtraBars.ItemClickEventArgs e) // 立即执行
{
if (this.lstTask.SelectedIndices.Count == 0)
{
this.ShowErrorMsg("请先选中需要立即执行的任务!");
return;
}
MetarCommonSupport.MsgTransceiver.Instance.SendMessageToTopoToStartTasK(task_id,operate, "0"); 给后台发消息开始执行任务
try
{
autoResetEvent.WaitOne(new TimeSpan(30000)); if (isStart)
{
this.txtStaus.Text = "运行中";
成功
else
{
失败
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
收后台的消息 我定义了一个bool型的全局变量isStart判断是否收到后台消息了 初始的isStart值为 false
private void Instance_TopoStart(object sender, string strTaskId, string strStart)
{
autoResetEvent.Set();
isStart = strStart == "0" ? true:false;
}你如果用while来做,第一会占用cpu,第二,时间无法控制,循环6000000甚至更多都无法得到一个准确的等待时间。
然后如果你的这个操作是并发的话,需要封装整个逻辑,但看样子是从界面触发的,这样应该就可以了。
那个TimeSpan,我记得是这么使用的,你查下帮助吧。包括AutoResetEvent的使用,你也可以查下msdn。
然后从你的代码来看,这句话的执行应该是异步的,它不会等待后台响应就会继续执行下去,那么它应该要定义callback入参的啊。