首页 新闻 会员 周边

c#反馈问题导致的无法再调用问题

0
悬赏园豆:15 [已解决问题] 解决于 2018-12-06 10:57

代码如下:按下按钮执行下面的方法,这个方法是和下位机通讯的,然后执行chooseChannel.Goto(response.StepId + 1, 30000) 的动作,但是因为下位机没有反馈,导致方法要等待整个动作完成,这就导致无法再次调用,必须等待完成。
现在就是我写了两个软件去执行这个动作,就可以达到连续执行的操作,只不过两个软件都是需要等待!这种情况,我想的是,是否可以动作执行,不等待它的反馈就结束动作,然后下次执行就继续调用!各位大神帮忙看看怎么更改!

private void button1_Click_1(object sender, EventArgs e)
{
thread = new Thread(new ParameterizedThreadStart(Jump));
thread.IsBackground = true;
NewareChannel chooseChannel = new NewareChannel(22, 19, 1, 1);
thread.Start(chooseChannel);
Thread.Sleep(100);
}

private void Jump(object obj)
{
lock (locker)
{
NewareChannel chooseChannel = (NewareChannel)obj;
try
{
Goto(chooseChannel);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}

    static NewareInquireResponse GetStepId(NewareChannel channel)
    {
        for (int i = 0; i < 4; i++)
        {
            NewareInquireResponse response = channel.Inquire(30000);
            if (response.StepId > 0)
            {
                //Console.WriteLine("GetStepId end");
                return response;
            }
        }
        return new NewareInquireResponse();
        //Console.WriteLine("GetStepId start");

    }

    private void Goto(NewareChannel chooseChannel)
    {
        NewareInquireResponse response = GetStepId(chooseChannel);
        if (response.StepId == 0)
        {
            return;
        }
        if (response.WorkStatus != "working")
        {
            return;
        }
        for (int i = 0; i < 4; i++)
        {
            if (chooseChannel.Goto(response.StepId + 1, 30000))
            {
                break;
            }
            else
            {
                NewareInquireResponse response1 = GetStepId(chooseChannel);
                if (response1.StepId == response.StepId + 1)
                {
                    break;
                }
            }
        }
    }
feiyangxu的主页 feiyangxu | 初学一级 | 园豆:186
提问于:2018-11-30 14:49
< >
分享
最佳答案
0

最后通过更改接口程序,每次连接都采用建立新连接,待发送成功后,在接口程序上断开连接,下次连接再新建!

feiyangxu | 初学一级 |园豆:186 | 2018-12-06 10:56
其他回答(1)
0

我觉得得看那个下位机是否支持了,不知道和你说的下位机是什么。如果这个下位机把所有的命令放到一个队列,挨个执行就可以,如果这个下位机执行不过来把命令给丢掉了,那就再想办法了,需要一个机制判断命令到底执行了没有

收获园豆:15
会长 | 园豆:12401 (专家六级) | 2018-11-30 15:00

有判断机制,代码最下面的 if (response1.StepId == response.StepId + 1)
{
break;
}
就是判断执行与否的机制,现在主要是动作有个反馈需要等待时间,我是想知道有没有办法避过这个反馈,就相当于我执行了动作,然后进行判断执行与否,不再等待反馈!就像我说的用两个软件去执行,互相是不等待反馈的

支持(0) 反对(0) feiyangxu | 园豆:186 (初学一级) | 2018-11-30 17:32

@feiyangxu: 听起来好用异步函数就行了

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2018-11-30 17:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册