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

哈利路亚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个左右
...全文
576 22 打赏 收藏 转发到动态 举报
写回复
用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("服务器启动监听成功!");
            //}
        }
主要特性Java 语言是简单的:Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。Java 语言是面向对象的:Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。Java语言是分布式的:Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。Java 语言是健壮的:Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。Java语言是安全的:Java通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。Java 语言是体系结构中立的:Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。Java 语言是可移植的:这种可移植性来源于体系结构中立性,另外,Java 还严格规定了各个基本数据类型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。Java 语言是解释型的:如前所述,Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个 Java 平台的任何系统中运行。在运行时,Java 平台中的 Java 解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。Java 是高性能的:与那些解释型的高级脚本语言相比,Java 的确是高性能的。事实上,Java 的运行速度随着 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++。Java 语言是多线程的:在 Java 语言中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子类将一个实现了 Runnable 接口的对象包装成一个线程,其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。值得注意的是 Thread 类已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为 synchronized)。Java 语言是动态的:Java 语言的设计目标之一是适应于动态变化的环境。Java 程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java 中的类有一个运行时刻的表示,能进行运行时刻的类型检查。

110,535

社区成员

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

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

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