C# 等待条件为真的最佳方法
我希望程序在变量来自plc时等待。我用while尝试了一个算法,但应用程序正在崩溃。代码如下。如何在c#中没有while循环的情况下执行此操作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[]偏
`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
}
}
}