求各位大神帮处理个报错信息啊 关于线程与监控的问题

哈利路亚2 2018-04-04 02:11:09
应用程序: WindowsFormsApplication1.exe Framework 版本: v4.0.30319 说明: 由于未经处理的异常,进程终止。异常信息: System.InvalidOperationException 在 System.Net.Sockets.Socket.Accept() 在 WindowsFormsApplication1.Form1.WatchConnecting() 在 System.Threading.ThreadHelper.ThreadStart_Context(System.Object) 在 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 在 System.Threading.ThreadHelper.ThreadStart()

上面是报错 我贴出代码来

 void WatchConnecting()
{
while (true) // 持续不断的监听客户端的连接请求;
{
// 开始监听客户端连接请求,Accept方法会阻断当前的线程;
Socket sokConnection = socketWatch.Accept(); // 一旦监听到一个客户端的请求,就返回一个与该客户端通信的 套接字;
// 想列表控件中添加客户端的IP信息;
lbOnline.Items.Add(sokConnection.RemoteEndPoint.ToString());
zxnum = zxnum + 1;
label1.Text = zxnum.ToString();
// 将与客户端连接的 套接字 对象添加到集合中;
dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection);
ShowMsg("客户端连接成功!");
Thread thr = new Thread(RecMsg);
thr.IsBackground = true;
thr.Start(sokConnection);
dictThread.Add(sokConnection.RemoteEndPoint.ToString(), thr); // 将新建的线程 添加 到线程的集合中去。
}
}


RecMsg的方法就是做一下简单的展示跟录入数据库的工作 请问各位大神 上面的代码哪里会出现刚才报错?应该怎么处理解决?

下面还有一部分代码

还有一个问题,代码运行一段时间后 比如1天后,内存的占用很高是为什么? 客户端也没链接多少上来,也就是50个左右
...全文
614 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-04-07
  • 打赏
  • 举报
回复
lbOnline.Items 和 dict 只增不减,总有一天会耗尽所有内存 RecMsg 中也可能有为释放的资源
哈利路亚2 2018-04-07
  • 打赏
  • 举报
回复
我将异常的信息抓出来了 但是不知道是哪里的问题 下面是异常的信息 异常:引发类型为“System.OutOfMemoryException”的异常。 异常:没有足够的内存继续执行程序。
哈利路亚2 2018-04-06
  • 打赏
  • 举报
回复
感谢各位回复的大神,但是我是个新手刚入门不久,还是不清楚到底改如何做,从哪里着手
jwb7832007 2018-04-05
  • 打赏
  • 举报
回复
你这代码跟我抄的是同一个,我这没问题,连续一个月也没问题, 我估计你是 zxnum = zxnum + 1; label1.Text = zxnum.ToString(); 这2句的问题,线程操作UI。 另外,在while监听里要加一句Thread.Sleep(10); 不然CPU占用很高
哈利路亚2 2018-04-05
  • 打赏
  • 举报
回复
引用 12 楼 sp1234 的回复:
每一层异常都有自己的提示信息。比如说 InnerException (也就是那个 InvalidOperationException)就有它自己的错误提示信息。 你没有跟踪、打印到异常信息,没有在(Release发布后的生产程序)进程最外层捕获异常、记录日志,而是直接任由进程崩溃了。
请问 改如何修改呢? 谢谢谢谢 我就是个新手 ,上面的代码也是用的别人的
  • 打赏
  • 举报
回复
每一层异常都有自己的提示信息。比如说 InnerException (也就是那个 InvalidOperationException)就有它自己的错误提示信息。 你没有跟踪、打印到异常信息,没有在(Release发布后的生产程序)进程最外层捕获异常、记录日志,而是直接任由进程崩溃了。
哈利路亚2 2018-04-05
  • 打赏
  • 举报
回复
有没有人啊???
xuzuning 2018-04-05
  • 打赏
  • 举报
回复
其实 Socket 有一个静态方法 Select,他可以静静的等待有效连接的出现 应该加以充分的利用
xuzuning 2018-04-05
  • 打赏
  • 举报
回复
异常信息: System.InvalidOperationException 在 System.Net.Sockets.Socket.Accept() 即 Socket sokConnection = socketWatch.Accept(); // 一旦监听到一个客户端的请求,就返回一个与该客户端通信的 套接字; vs 是这样说明的 // System.InvalidOperationException: // 正在接受的套接字不会侦听连接。在调用 System.Net.Sockets.Socket.Accept() 之前必须调用 System.Net.Sockets.Socket.Bind(System.Net.EndPoint) // 和 System.Net.Sockets.Socket.Listen(System.Int32)。 相信你一定有这两个操作 可能是连接数超限了,还是有什么原因造成退出监听状态了 肯定与 UI 冲突是没有关系的
哈利路亚2 2018-04-05
  • 打赏
  • 举报
回复
引用 14 楼 jwb7832007 的回复:
你这代码跟我抄的是同一个,我这没问题,连续一个月也没问题, 我估计你是 zxnum = zxnum + 1; label1.Text = zxnum.ToString(); 这2句的问题,线程操作UI。 另外,在while监听里要加一句Thread.Sleep(10); 不然CPU占用很高
zxnum = zxnum + 1; label1.Text = zxnum.ToString(); 没加这个之前也出现过 运行2天左右就报错了 完事就无响应了 我运行的时候CPU倒是不高 不过内存消耗很大 你那个运行几天后没出问题吗?
哈利路亚2 2018-04-04
  • 打赏
  • 举报
回复
顶顶顶顶顶顶顶顶
哈利路亚2 2018-04-04
  • 打赏
  • 举报
回复
引用 8 楼 guonan198811 的回复:
这种错误一般来源有两个,一个是同一个窗体被两个线程访问了,winform是UI独占式运行方式,同一时间只有一个UI能持有主线程。另一个可能就是同一份数据同时被两个地方调用了。如果楼主想查出来具体原因,你需要打断点详细跟踪代码,确定哪一句出的问题,再分析。
您说的我大体看明白了,但是不太好调试,因为这个问题不是运行就出现,这个窗体跑个2天3天才不定期的出现这个错误,所以没头绪怎么去找问题啊
哈利路亚2 2018-04-04
  • 打赏
  • 举报
回复
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
南天空 2018-04-04
  • 打赏
  • 举报
回复
这种错误一般来源有两个,一个是同一个窗体被两个线程访问了,winform是UI独占式运行方式,同一时间只有一个UI能持有主线程。另一个可能就是同一份数据同时被两个地方调用了。如果楼主想查出来具体原因,你需要打断点详细跟踪代码,确定哪一句出的问题,再分析。
哈利路亚2 2018-04-04
  • 打赏
  • 举报
回复
求大神给解答一下啊
哈利路亚2 2018-04-04
  • 打赏
  • 举报
回复
怎么搞怎么搞怎么搞怎么搞怎么搞
2081 2018-04-04
  • 打赏
  • 举报
回复
意外的发现了抄的代码 换成socket原来的接收事件试一下
哈利路亚2 2018-04-04
  • 打赏
  • 举报
回复
有没有大神帮解答下问题啊!!!!能解决的加我微信我给你额外发红包也行啊 比较着急啊
哈利路亚2 2018-04-04
  • 打赏
  • 举报
回复
上面是所有的代码了。 一开始不出现问题 ,运行个1 2天之后,就出现一开始贴出来的那个错误。请问是什么原因呢?应该怎么处理?
哈利路亚2 2018-04-04
  • 打赏
  • 举报
回复
 private void btnBeginListen_Click(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            // 创建负责监听的套接字,注意其中的参数;
            socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // 获得文本框中的IP对象;
            IPAddress address = IPAddress.Parse(txtIp.Text.Trim());
            // 创建包含ip和端口号的网络节点对象;
            IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
            try
            {
                // 将负责监听的套接字绑定到唯一的ip和端口上;
                socketWatch.Bind(endPoint);
            }
            catch (SocketException se)
            {
                MessageBox.Show("异常:" + se.Message);
                return;
            }
            // 设置监听队列的长度;
            socketWatch.Listen(10);
            // 创建负责监听的线程;
            threadWatch = new Thread(WatchConnecting);
            threadWatch.IsBackground = true;
            threadWatch.Start();
            ShowMsg("服务器启动监听成功!");
            //}
        }

111,098

社区成员

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

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

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