当我运行代码时,我的表单会立即冻结。我不确定原因,但请查看下面的代码并查看截图。基本上当我运行我的代码时,一旦我的代码加载,表单会冻结,它只是说“没有响应”它可以做什么?
namespace MySample
{
public class Driver
{
static void Main(string[] args)
{
log4net.Config.XmlConfigurator.Configure();
Form1 form = new Form1();
form.Show();
try
{
StartModbusSerialRtuSlave();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
public static void StartModbusSerialRtuSlave()
{
using (SerialPort slavePort = new SerialPort("COM1"))
{
// configure serial port
slavePort.BaudRate = 38400;
slavePort.DataBits = 8;
slavePort.Parity = Parity.Odd;
slavePort.StopBits = StopBits.One;
slavePort.Open();
byte unitId = 1;
// create modbus slave
ModbusSlave slave = ModbusSerialSlave.CreateRtu(unitId, slavePort);
slave.DataStore = DataStoreFactory.CreateDefaultDataStore();
slave.Listen();
}
}
}
表格代码
namespace MySample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
答案 0 :(得分:1)
函数StartModbusSerialRtuSlave
未返回。对Listen
的调用可能会阻塞,这通常很好,但它在UI线程上。
因为它不在自己的线程上执行(与UI分开),所以它会导致应用程序锁定"并传递您看到的错误消息。
简单修复,不要在UI线程上执行长时间运行的操作。在他们自己的线程上启动I / O之类的东西。
例如:
log4net.Config.XmlConfigurator.Configure();
try
{
new Thread((p) => StartModbusSerialRtuSlave()).Start();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
//Start your form the right way!
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());