winfrom启动就开始不断的连接通信,直到连接上为止

我深知我该努力了 2018-01-26 08:21:59
程序有一块跟PLC通信的,要求程序开机自启动
启动就要连接plc
可能会出现PLC启动比电脑开机还慢
所以我要启动就不停的连接,直到连接上

应该怎么写,写在哪里呢
...全文
494 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 15 楼 ghostalker 的回复:
哦 忘了说 我其实在处理任务的时候停止了定时器 我觉得用while 加 thread.sleep 方法挺好 应为 当我如果想修改 执行时间间隔的时候 我直接修改 thread.sleep(变量)值就行,但是对于timer 需要修改执行时间后 将timer停止 再启动 因为timer的时间间隔好像不能实施更改 ,听说timer使用了线程池 。我也觉得对系统开销大了些。
既然你停止了定时器,你还能根据什么来说“有时一个星期 服务就被卡死”是定时器的问题呢?这就是毫无半点借口了。 既然你是正常地在处理任务之前先停止了定时器,那么又怎么会觉得修改下一次定时时间前停止timer嫌麻烦呢?这明显说明你并没有想去在执行任务之前停止定时器。 “听说timer使用了线程池”这又是什么意思?timer 是硬件中断、操作系统机制、.net 框架的核心的底层机制,进行了高级的优化。10万个timer也不过使用很少的资源来驱动,根本不是某些认为的所谓的使用10万个死循环子线程那种概念,这其实早就把系统弄死了,所以你说的“觉得对系统开销大了些”恰好是你的那种想法才造成的。
yuanchao1985 2018-01-27
  • 打赏
  • 举报
回复
//程序启动,在formLoad里创建一个线程,线程里面一直尝试连接PLC,连接成功,线程结束
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();          
        }
     
        private void Form1_Load(object sender, System.EventArgs e)
        {
            Task.Factory.StartNew(AutoConnect);//程序启动,创建一个线程
        }
        private void AutoConnect()
        {
            
            while (true)
            {                   
                if (po.opcLianJie())
                {
                    BeginInvoke(new Action(() => { richTextBox.Text += "连接成功"; }));
                       
                    break;
                }
                else
                {
                    BeginInvoke(new Action(() => { richTextBox.Text += "正在连接中……"; }));
                       
                }
                Thread.Sleep(5000);
            }
 
        }

        public  class po
        {
            public   static bool opcLianJie()
            {
                return true;
            }
        }
    }
}
yuanchao1985 2018-01-27
  • 打赏
  • 举报
回复
//程序启动,在formLoad里创建一个线程,线程里面一直尝试连接PLC,连接成功,线程结束 using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, System.EventArgs e) { Task.Factory.StartNew(AutoConnect);//程序启动,创建一个线程 } private void AutoConnect() { while (true) { if (po.opcLianJie()) { BeginInvoke(new Action(() => { richTextBox.Text += "连接成功"; })); break; } else { BeginInvoke(new Action(() => { richTextBox.Text += "正在连接中……"; })); } Thread.Sleep(5000); } } } }
  • 打赏
  • 举报
回复
是可以的 ,用timer妥妥滴,多谢了
秋的红果实 2018-01-26
  • 打赏
  • 举报
回复
引用 9 楼 ghostalker 的回复:
[quote=引用 5 楼 duanzi_peng 的回复:] [quote=引用 3 楼 xomix 的回复:] 加个timer吧,不然你这个客户端一跑就是个网络炸弹,网络拥堵的锅你敢背吗?
是的。while(true) 是坚决舍弃不用的。[/quote] 啊 最近我写的东西 一个window服务 每隔多少秒 查找4台机器的数据库 并且将数据上传 ,结果用time方式发现运行有时1个月 有时一个星期 服务就被卡死 当我将它变成应用程序 用vs调试模式下运行 也是1个星期 或1个月 左右卡死 ,并且在vs中还不抛出任何异常。 我最近改为 while(true) 并且运行完一段时间后 thread.sleep()几秒 来看看效果。我反而觉得timer不好[/quote]具体问题具体分析,像lz这种,要是主线程用上这个while,会一直等待,直到连接成功,用户不满意,而且也没有合理利用时间
ghostalker 2018-01-26
  • 打赏
  • 举报
回复
引用 5 楼 duanzi_peng 的回复:
[quote=引用 3 楼 xomix 的回复:] 加个timer吧,不然你这个客户端一跑就是个网络炸弹,网络拥堵的锅你敢背吗?
是的。while(true) 是坚决舍弃不用的。[/quote] 啊 最近我写的东西 一个window服务 每隔多少秒 查找4台机器的数据库 并且将数据上传 ,结果用time方式发现运行有时1个月 有时一个星期 服务就被卡死 当我将它变成应用程序 用vs调试模式下运行 也是1个星期 或1个月 左右卡死 ,并且在vs中还不抛出任何异常。 我最近改为 while(true) 并且运行完一段时间后 thread.sleep()几秒 来看看效果。我反而觉得timer不好
xiaoyu5425 2018-01-26
  • 打赏
  • 举报
回复
加timer吧,最好再加个进度条
wanghui0380 2018-01-26
  • 打赏
  • 举报
回复
Lazy<Task> initLazy=new Lazy<Task>(()=>Task.Factory.StartNew(() => { //你要做的事情 })) 后面的事情,你是await也好,continue也罢,请随意
exception92 2018-01-26
  • 打赏
  • 举报
回复
引用 3 楼 xomix 的回复:
加个timer吧,不然你这个客户端一跑就是个网络炸弹,网络拥堵的锅你敢背吗?
是的。while(true) 是坚决舍弃不用的。
exception92 2018-01-26
  • 打赏
  • 举报
回复
异步方式执行连接逻辑,而不影响窗口继续加载显示,在异步回调里返回连接之后的状态到界面即可。
zhuowp 2018-01-26
  • 打赏
  • 举报
回复
try catch应该放在while里面,保证即使出现异常while循环也不终端才对。
  • 打赏
  • 举报
回复
加个timer吧,不然你这个客户端一跑就是个网络炸弹,网络拥堵的锅你敢背吗?
zhuowp 2018-01-26
  • 打赏
  • 举报
回复
        private void Form1_Load(object sender, EventArgs e)
        {
            Thread pclConnectThread = new Thread(() =>
            {
                while(true)
                {
                    if (po.opcLianJie())
                    {
                        this.Invoke((Action)delegate
                        {
                            richTextBox.Text += "连接成功";
                        });

                        break;
                    }
                    else
                    {
                        this.Invoke((Action)delegate
                        {
                            richTextBox.Text += "连接失败";
                        });
                    }

                    Thread.Sleep(5000);
                }
            });

            plcConnectThread.Start();
        }
在新线程中连接。
assky124 2018-01-26
  • 打赏
  • 举报
回复
放个backgroundworker 组件,后天慢慢执行就好了
cheng2005 2018-01-26
  • 打赏
  • 举报
回复
引用 15 楼 ghostalker 的回复:
[quote=引用 12 楼 sp1234 的回复:] [quote=引用 9 楼 ghostalker 的回复:] 啊 最近我写的东西 一个window服务 每隔多少秒 查找4台机器的数据库 并且将数据上传 ,结果用time方式发现运行有时1个月 有时一个星期 服务就被卡死 当我将它变成应用程序 用vs调试模式下运行 也是1个星期 或1个月 左右卡死 ,并且在vs中还不抛出任何异常。
那说明你的任务非常慢,并且你没有在处理任务时停止 timer 定时器。[/quote] 哦 忘了说 我其实在处理任务的时候停止了定时器 我觉得用while 加 thread.sleep 方法挺好 应为 当我如果想修改 执行时间间隔的时候 我直接修改 thread.sleep(变量)值就行,但是对于timer 需要修改执行时间后 将timer停止 再启动 因为timer的时间间隔好像不能实施更改 ,听说timer使用了线程池 。我也觉得对系统开销大了些。如有疑问 谢谢指导。[/quote] 没法写高质量代码的情况下,能写出什么好用的代码就用什么代码就可以了,没必要继续纠结了。
ghostalker 2018-01-26
  • 打赏
  • 举报
回复
引用 12 楼 sp1234 的回复:
[quote=引用 9 楼 ghostalker 的回复:] 啊 最近我写的东西 一个window服务 每隔多少秒 查找4台机器的数据库 并且将数据上传 ,结果用time方式发现运行有时1个月 有时一个星期 服务就被卡死 当我将它变成应用程序 用vs调试模式下运行 也是1个星期 或1个月 左右卡死 ,并且在vs中还不抛出任何异常。
那说明你的任务非常慢,并且你没有在处理任务时停止 timer 定时器。[/quote] 哦 忘了说 我其实在处理任务的时候停止了定时器 我觉得用while 加 thread.sleep 方法挺好 应为 当我如果想修改 执行时间间隔的时候 我直接修改 thread.sleep(变量)值就行,但是对于timer 需要修改执行时间后 将timer停止 再启动 因为timer的时间间隔好像不能实施更改 ,听说timer使用了线程池 。我也觉得对系统开销大了些。如有疑问 谢谢指导。
Roselle_2013 2018-01-26
  • 打赏
  • 举报
回复
把方法改成异步一般就可以了,代码可以参考一下

private async void MainInterface_Load(object sender,EventArgs e)
        {
            BLL.XiTongLog.Add("Application Start",null,null);
            await Task.Run(new Action(() =>
            {
                var msg = "";
                while (true)
                {
                    try
                    {
                        if (po.OPCLianJie())
                        {
                            msg = "OPCConnection\r\n"; 
                            break;
                        }
                        else
                            msg = "OPCConnecting";
                        Dispather.Invoke(new Action(() =>
                        {
                            richTextBox2.Text += msg;
                        }));
                        Task.Delay(5000).Wait();
                    }
                    catch { }
                }
            }));
        }
Jason_Mao1 2018-01-26
  • 打赏
  • 举报
回复
我觉得你这个单纯用循环去连接的话有问题 ,你得定义几种消息模式、比如连接成功的状态,连接失败 ,断开等等。相应的状态得对应相应的处理机制 。还得有一个心跳包的机制,就是监控连接状态。断开多久后腰重新连接等待。希望能帮助到你。
  • 打赏
  • 举报
回复
引用 9 楼 ghostalker 的回复:
啊 最近我写的东西 一个window服务 每隔多少秒 查找4台机器的数据库 并且将数据上传 ,结果用time方式发现运行有时1个月 有时一个星期 服务就被卡死 当我将它变成应用程序 用vs调试模式下运行 也是1个星期 或1个月 左右卡死 ,并且在vs中还不抛出任何异常。
那说明你的任务非常慢,并且你没有在处理任务时停止 timer 定时器。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧