从后台接受消息 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
{
失败
}现在请各位大侠给小弟写一个用线程来处理的这个问题的方法,我是刚工作的新人,线程不会用,非常感谢!!或者用其他方法能处理也可以,只是要专业一点的,呵呵~ 谢谢 !

解决方案 »

  1.   

    要是用线程处理的话逻辑应该是:
    先让当前线程 sleep 30 秒 
    然后写一个线程一直收后台消息  如果isStart为真的话立马唤醒当前线程 如果三十秒以后isStart还为假 也要唤醒当前线程 提示失败
    我认为逻辑应该是这样,请大侠们指点一下 ,还有线程不会写,郁闷啊,各位路过的帮忙,可以加分,谢谢!
      

  2.   

    AutoResetEvent event = new AutoResetEvent(false);
    event.WaitOne();然后后来反馈过来了,event.Set();
    前台就开始做了,这样就不是延迟的事情了,是由后台来驱动前台了。
    或者异步调用后台,定义callback事件也可以做到这点。
      

  3.   

     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
                {
                    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;
            }
      

  4.   

    AutoResetEvent autoResetEvent = new AutoResetEvent(false); // this is a global variant.
    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。
      

  5.   

    MetarCommonSupport.MsgTransceiver.Instance.SendMessageToTopoToStartTasK(task_id,operate, "0");  给后台发消息开始执行任务 
    然后从你的代码来看,这句话的执行应该是异步的,它不会等待后台响应就会继续执行下去,那么它应该要定义callback入参的啊。
      

  6.   

    逻辑是 先由前台给后台发消息SendMessageToTopoToStartTasK,他不需要后台响应的啊,是在界面上单击一个button就可以了啊 ,然后再收Instance_TopoStart,就可以了啊,不需要定义callback入参吧
      

  7.   

    我的意思是可以通过定义callback来实现的,其实就是将 Instance_TopoStart传递给它,它能异步回调这个函数就可以了,我认为逻辑应该是这样的,不知道现在你是怎么调用 Instance_TopoStart的。
      

  8.   

      MetarCommonSupport.MsgTransceiver.Instance.TopoStart += new TopoStartEventHander(Instance_TopoStart);我是在构造函数里面调用的,不知道这样写合理吗?
      

  9.   

    呵呵,这个事件就是callback的功能了。这样就完整了。
      

  10.   

    为什么还要到你做后台的同事回来呢?你们没有单元测试的吗?你可以mock一下吗,让你的程序调用一个mock方法,返回真实方法的模拟数据,然后看程序是否会阻塞,然后你再做一个button去调用那个你绑定到事件的方法,看程序是否正常运行。不就ok了?