项目时直接通过melsoft连接PLC,调用open,当plc没有连接时导致程序卡
1.在winform中我将打开plc和与plc操作有关的放到
Task.Factory.StartNew(() =>{ }..
中 有的操作又放到里面嵌套的线程中,有的没有放进去.这个时候能实现异步 不会阻塞ui和程序的其他操作.
2.但是当我在wpf中使用类似和同样的结构,出现了两种情况:1.连不上plc但是可以操作,不一定是正确的操作..2.真就卡着请求连接,直到超时
经过我多次的尝试解决了问题
Task.Factory.StartNew(() =>
{
plcHelper1 = new PlcHelper(1);
PlcHelper.PLCError += ShowError;
PlcHelper.PLCRight += ShowRight;
plcHelper1.Openq();
System.Timers.Timer timer_starStatu = new System.Timers.Timer();
timer_starStatu.Enabled = true;
timer_starStatu.Interval = 500;
timer_starStatu.Elapsed += new System.Timers.ElapsedEventHandler(setStatu);
timer_starStatu.Start();
//这个定时的方法是频繁操作plc的,原方法是在类似底下那种里面的
///下面的点击事件,也是操作plc的,,因为plc未连接时也会点击,造成卡死,所就都放进来,这样就不影响//程序,,,当连上plc也不影响原本的操作
bot.btn8_bot.Click += McReset;//复位i
bot.btn9_bot.Click += McStop;//停止
Task.Run(() =>
{
Dispatcher.Invoke(new Action(() =>
{ //这里面我放的是对plc操作频繁的(比如上面的定时).....至于需不需要这两个嵌套我没有测试,因为效果已经出来了
当然我也试了不放进这个线程,,但是会出现我这些频繁的操作没有效果,实际上plc能被读写..
也怀疑是不是那个定时方法中的
Task.Run(() =>
{
Dispatcher.Invoke(new Action(() =>
这个影响的,注释后没什么变化,,,,最后只能都放到这个里面了
主要是我在winform中只用Task.Factory.StartNew(() =>这个就实现了