我运行程序时表单冻结

时间:2014-08-14 00:15:47

标签: c# forms

当我运行代码时,我的表单会立即冻结。我不确定原因,但请查看下面的代码并查看截图。基本上当我运行我的代码时,一旦我的代码加载,表单会冻结,它只是说“没有响应”它可以做什么?

screenshot of Form

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();

    }
 }
}

1 个答案:

答案 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());