新手关于 "未将对象引用设置到对象的实例" 的问题求教

godfly000 2014-08-30 05:46:43
别人的程序,需要简单修改下,发现出现这个问题,关闭程序时会出现“未将对象引用设置到对象的实例”,以下是有关源码和调试说明。
namespace sincgars
{
public partial class Form1 : Form
{
...
public UdpClient listener1, listener2;//创建UDPclient监听
...
}
}

public Form1(int TYPE,string S)
{
...
thread1 = new Thread(new ThreadStart(messageListening1));
thread1.Start();
thread2 = new Thread(new ThreadStart(messageListening2));
thread2.Start();//开启线程
...

}

private void messageListening1()//监听数据
{
int port = 8001;//设置端口号
listener1 = new UdpClient(port);//创建一个UDPClient监听8001端口号
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, port);
while (true)
{
byte[] data = new byte[1024];
data = listener1.Receive(ref ipep);//接收数据
...
}
}


private void messageListening2()//监听数据
{
int port = 8002;//设置端口号
listener1 = new UdpClient(port);//创建一个UDPClient监听8002端口号
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, port);
while (true)
{
byte[] data = new byte[1024];
data = listener2.Receive(ref ipep);//接收数据
...
}
}


private void Form1_FormClosing(object sender, FormClosingEventArgs e)//窗口关闭时触发的事件
{
thread1.Abort();
listener1.Close();//未将对象引用设置到对象的实例

thread2.Abort();
listener2.Close();//未将对象引用设置到对象的实例

}

listener1/listener2在调用CLose前自动窗口显示的属性
listener1 {System.Net.Sockets.UdpClient} System.Net.Sockets.UdpClient
listener2 {System.Net.Sockets.UdpClient} System.Net.Sockets.UdpClient

active:false
available:0x00000000

.netframwork 是2.0的版本
...全文
583 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
卧_槽 2014-09-09
  • 打赏
  • 举报
回复
做程序员,首先得找着对象。
於黾 2014-09-09
  • 打赏
  • 举报
回复
listener1.Receive之前 先判断缓冲区里是否 有数据 而不是不管里面有没有,都调用Receive方法让它死在方法里
godfly000 2014-09-08
  • 打赏
  • 举报
回复
while(true) { if(bool) { break; } } 由于 data = listener1.Receive(ref ipep);//接收数据 是阻塞调用,所以变量起不了作用的
引用 11 楼 mlqxj35674 的回复:
很简单啊,程序结束时,线程早就结束了,listener已经为空,而你没有检测listener是否有效,直接就给Close(),
我的问题里已经写了,调试时显示listener1的信息,应该不是NULL: listener1/listener2在调用CLose前自动窗口显示的属性 listener1 {System.Net.Sockets.UdpClient} System.Net.Sockets.UdpClient listener2 {System.Net.Sockets.UdpClient} System.Net.Sockets.UdpClient active:false available:0x00000000 .netframwork 是2.0的版本 之前尝试这样写,在构造函数中 public Form1(int TYPE,string S) { int port = 8002;//设置端口号 listener1 = new UdpClient(port);//创建一个UDPClient监听8002端口号 listener1.Close();//断点调试,这里一样会出现"未将对象引用设置到对象的实例" } 这是为什么???????
於黾 2014-09-01
  • 打赏
  • 举报
回复
哪里OPEN就在哪里CLOSE,是最简单的了 不要在其他函数/类甚至其他线程里去CLOSE
mlqxj35674 2014-09-01
  • 打赏
  • 举报
回复
很简单啊,程序结束时,线程早就结束了,listener已经为空,而你没有检测listener是否有效,直接就给Close(),
於黾 2014-09-01
  • 打赏
  • 举报
回复
不要while(ture)死循环,在外部停止线程,那样会出现各种顺序有关的问题 你应该while(bool) 或 while(true) { if(bool) { break; } } 用变量控制,让线程自己退出 而窗口关闭时,只去控制这个变量就行了
rayyu1989 2014-08-31
  • 打赏
  • 举报
回复
if(listener1 !=null){ }
浪子er 2014-08-31
  • 打赏
  • 举报
回复
关闭的时候判断一下不就行了?
godfly000 2014-08-31
  • 打赏
  • 举报
回复
我觉得这个程序的逻辑其实很简单,就是构造函数里开两个线程,线程中阻塞方式监听两个网络端口的数据,关闭窗口时,关闭线程和监听函数,现在是监听函数关不掉。 大侠们也可以给贴一个简单的C#监听例程,包括初始化/监听和关闭,我把它们给替换掉,多谢!
godfly000 2014-08-31
  • 打赏
  • 举报
回复
之前尝试这样写,在构造函数中 public Form1(int TYPE,string S) { int port = 8002;//设置端口号 listener1 = new UdpClient(port);//创建一个UDPClient监听8002端口号 listener1.Close();//断点调试,这里一样会出现"未将对象引用设置到对象的实例" }
godfly000 2014-08-31
  • 打赏
  • 举报
回复
各位大侠说的可能都没错,因为写这个代码的人辞职了,现在需要改一下 回答几个问题先: listener1的定义在线程函数里: listener1 = new UdpClient(port);//创建一个UDPClient监听8002端口号; Thread的定义在构造函数里 public Form1(int TYPE,string S) { ... thread1 = new Thread(new ThreadStart(messageListening1)); thread1.Start(); thread2 = new Thread(new ThreadStart(messageListening2)); thread2.Start();//开启线程 ... } 顺序之前颠倒过没有用; listener1.Close();//未将对象引用设置到对象的实例 thread1.Abort(); listener2.Close();//未将对象引用设置到对象的实例 thread2.Abort(); 另外本人编码8年经验,因为之前主要是嵌入式软件,这个C#的第一次摸索,见笑了,不过基本的调试经验还是有的; 希望大家能认真给看下问题在哪里?可以加分
smthgdin_020 2014-08-30
  • 打赏
  • 举报
回复
断点调试。 这个都是那个对象为null引起的。
  • 打赏
  • 举报
回复
除了 listener2以外,你的什么 thread1、thread2的定义与使用也是存疑的。而且程序整体的设计也看来是抄了比较垃圾的代码。 不过最主要的还是“自己动手”问题。你要有自己动手调试的意识、知道给别人说“bug现象”的时候该帖出什么信息来,就能进步。否则就只能抄别人的代码,然后请别人瞎猜你的代码“有什么问题”。
  • 打赏
  • 举报
回复
你在哪里为变量 listener2 赋值了呢? 编程的目的(最起码地)是为了调试。你先搞懂调试技术,然后再动手真正去编程。当你遇到“未将对象.....”异常的时候,应该让vs的调试器停止在抛出异常的语句上,你能够调试到哪一个变量出现的问题,你能够调试到调用堆栈。
EdsionWang 2014-08-30
  • 打赏
  • 举报
回复

   listener1.Close();//未将对象引用设置到对象的实例
   thread1.Abort();
         
                listener2.Close();//未将对象引用设置到对象的实例        
            thread2.Abort();

这几句代码换个顺序

110,539

社区成员

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

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

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