C# 等待条件为真的最佳方法

C# 等待条件为真的最佳方法,c#,winforms,C#,Winforms,我希望程序在变量来自plc时等待。我用while尝试了一个算法,但应用程序正在崩溃。代码如下。如何在c#中没有while循环的情况下执行此操作 `private void toolStripButton2\u单击(对象发送方,事件参数e) { TcpClient client=新的TcpClient(); ModbusIpMaster master=ModbusIpMaster.CreateIp(客户端); client.Connect(“192.168.0.1”,502); ushort[]偏

我希望程序在变量来自plc时等待。我用while尝试了一个算法,但应用程序正在崩溃。代码如下。如何在c#中没有while循环的情况下执行此操作

`private void toolStripButton2\u单击(对象发送方,事件参数e)
{
TcpClient client=新的TcpClient();
ModbusIpMaster master=ModbusIpMaster.CreateIp(客户端);
client.Connect(“192.168.0.1”,502);
ushort[]偏移量=新的ushort[4];
对于(int j=0;j
一些建议:

  • 将click事件处理程序中的实现移动到另一个方法/类(阅读一些关于原则的内容)
  • 使检查PLC异步的方法成为异步的,这样你就不会阻塞主线程,也不会得到你所说的错误
--

公共类PlcChecker
{
TcpClient客户端{get;set;}
ModbusIpMaster主机{get;set;}
公共PlcChecker()
{
client=新的TcpClient();
}
公共异步任务连接(字符串ip,int端口)
{
ModbusIpMaster master=ModbusIpMaster.CreateIp(客户端);
client.Connect(ip,端口);
}
公共异步任务检查()
{
//调用master和while的代码(true)
}
}
公共类YourWinForm
{
公共PlcChecker plcChekcer{get;私有集;}
私有异步void toolStripButton2\u单击(对象发送方,事件参数e)
{
plcChekcer=新的PlcChecker();
等待plcChekcer.Connect(“192.168.0.1”,502);
bool result=等待plcChekcer.Check();
如果(结果)
{
//做点什么
}
}
}

但应用程序正在中断。
以何种方式中断?当程序进入循环以等待来自PLC的数据时,如果应用程序长时间等待@MJwills,则应用程序将中断。您几乎肯定需要有一个循环,因为您需要轮询PLC。PLC有可能但不太可能将事件推给您处理。它可能是“破坏性的”,因为它不断地轮询事物,没有时间做任何其他事情。您可以使用async/wait和Task.Delay来解决这个问题。或者,如果您非常懒惰,不想正确地处理它,您可能会在该循环中抛出Application.DoEvents。名为PLC的值指示机器人的手是打开还是关闭的。我将偏移发送到x、y和z轴,机器人将根据手是打开还是关闭的方向移动。我不知道机器人能每隔多长时间走一次。所以我不想使用延迟@MineRWell实验-放一个线程。在循环中睡眠10毫秒,看看会发生什么。首先感谢您的帮助。有两个while循环。它们相互嵌套。偏移量[3]用于检查夹持器是否打开。第一个循环是检查机器人是否从原点取下了产品。当它为真时,我发送机器人应该放置产品调色板的点的偏移量,代码输入secondwhile循环。这个循环正在检查机器人是否变白并放置产品。当它为真时,我发送原点的偏移量,两个循环都断开。你写的代码能处理吗?PlcChecker类的检查方法给出了一个错误。为什么?@badulakeI认为你的阻塞问题在于你用一个无限循环阻塞了主线程。如果你使用这个方法,你将在另一个线程中运行代码,这样你就不会阻止APPU可以考虑将2个循环分成2个单独的方法。你不需要把一个嵌套在另一个里面好的,谢谢,我会试试的。检查方法给出的生成错误是什么@badulakeMy代码是伪代码。如果你愿意,请放弃投票
   `private void toolStripButton2_Click(object sender, EventArgs e)
    {
        TcpClient client = new TcpClient();
        ModbusIpMaster master = ModbusIpMaster.CreateIp(client);
        client.Connect("192.168.0.1", 502);

        ushort[] offsets = new ushort[4];
        for (int j = 0; j < a; j++)
        {
            string[] numbers = Regex.Split(coordinateLabel[j].Text, @"\D+");
            int index = 0;
            foreach (string value in numbers)
            {
                if (!string.IsNullOrEmpty(value))
                {
                    int i = int.Parse(value);
                    offsets[index] = (ushort)(i);
                    index++;
                }
            }
            master.WriteSingleRegister(0, offsets[1]);
            master.WriteSingleRegister(1, offsets[2]);
            master.WriteSingleRegister(2, (ushort)(variable_Z[j]));
            while (true)
            {
                offsets = master.ReadHoldingRegisters(0, 4);
                if (offsets[3] == 1)
                {
                    master.WriteSingleRegister(0, 0);
                    master.WriteSingleRegister(1, 0);
                    master.WriteSingleRegister(2, 0);
                    while (true)
                    {
                        offsets = master.ReadHoldingRegisters(0, 4);
                        if (offsets[3] == 0)
                        {
                            break;
                        }
                    }
                    break;
                }
            }
        }
        client.Close();
    }`
public class PlcChecker
{
   TcpClient client {get;set;}
   ModbusIpMaster master{get;set;}

   public PlcChecker()
   {
      client= new TcpClient();
    }

    public async Task Connect(string ip,int port)
    {
      ModbusIpMaster master = ModbusIpMaster.CreateIp(client);
      client.Connect(ip,port);
    }

     public async Task<bool> Check()
     {
       //your code to call master and while(true)
     }

}

 public class YourWinForm
{
    public PlcChecker plcChekcer { get; private set; }

    private async void toolStripButton2_Click(object sender, EventArgs e)
    {
        plcChekcer = new PlcChecker();
        await plcChekcer.Connect("192.168.0.1", 502);
        bool result = await plcChekcer.Check();
        if(result)
        {
             //do something   
        }

    }
}