C# backgroundWorker问题

cvhj 2013-08-20 09:50:01
请问怎么结束backgroundWorker的线程?我使用了backgroundWorker1.CancelAsync();,这个好像只是挂起线程而已,并没有彻底关闭掉backgroundWorker1的线程,我运行了backgroundWorker1.CancelAsync();然后再运行
backgroundWorker1.RunWorkerAsync();会报错,说 backgroundWorker正忙的错,请问怎么彻底结束掉 backgroundWorker线程?
...全文
246 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
cvhj 2013-08-21
  • 打赏
  • 举报
回复
引用 10 楼 dongxinxi 的回复:
private List<Socket> _clients = new List<Socket>(); byte[] Mess = new byte[1024];//定义接收数据byte数组 s.Bind(iep); s.Listen(100000);//链接数 while (true) { Socket m = s.Accept();//阻塞监听端口 _clients.Add(m); m.Receive(Mess); message = Encoding.UTF8.GetString(Mess); return message; } 这样?
然后这个里面的List<Socket> _clients = new List<Socket>();Socket里面的类怎么写?
  • 打赏
  • 举报
回复
要支持异步任务取消,你得先设置backgroundWorker1.WorkerSupportsCancellation= true; backgroundWorker1.CancelAsync();只是将信号量置为取消状态 所以你还得在执行任务时判断
DoWork()
{
    //假设是循环任务
    while(!backgroundWorker1.CancellationPending)
    {
         do sth..
    }
}
报忙 就是因为你没有判断,导致先前的任务还没执行完(没有真正取消)
cvhj 2013-08-20
  • 打赏
  • 举报
回复
引用 4 楼 tcmakebest 的回复:
[quote=引用 2 楼 u011612654 的回复:] [quote=引用 1 楼 tcmakebest 的回复:] 很简单的,设一个全局变量,然后在线程的循环中检测到就退出。
IPAddress ipa = IPAddress.Parse(IP);//IP 地址
                IPEndPoint iep = new IPEndPoint(ipa, port);
                Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                byte[] Mess = new byte[1024];//定义接收数据byte数组
                s.Bind(iep);
                while (true)
                {
                    s.Listen(100000);//链接数
                    Socket m = s.Accept();//阻塞监听端口
                    m.Receive(Mess);
                    message = Encoding.UTF8.GetString(Mess);
                    return message;
                }
但是执行到Accept的时候如果没有连接的时候就一直阻塞端口,那如果在这个时候要退出线程,而且又没有连接连上来那怎么办呢?[/quote] 这个设计问题真多啊,Listen 怎么放到循环中去了? Receive 应该放到子线程中,如果客户端不发数据它也会阻塞。 这里一个客户端连接上来后,就 return 了,s 被遗弃了?m 也被遗弃了? 楼主仍需努力,多看看书吧。[/quote] Socket m = s.Accept();是阻塞端口,当有客户端连接上来的时候就新开一个socket用来接收信息, m.Receive(Mess);这个是接收客户端往服务端发送的信息,当接收到之后就把信息放到Mess数组中,在把byte数组转换为字符串,message = Encoding.UTF8.GetString(Mess); 然后把客户端发送的信息return message;返回并且显示出来,我在网上找的示例代码都是这样写的,我以前在学校的时候也是这样的啊?有点不太懂你的意思,能给出代码我看看吗?还有那个结束线程 的问题怎么解决?
人生导师 2013-08-20
  • 打赏
  • 举报
回复
参考这个文章:http://www.cnblogs.com/zhili/archive/2013/05/11/EAP.html 有很详细的分析过程
tcmakebest 2013-08-20
  • 打赏
  • 举报
回复
引用 2 楼 u011612654 的回复:
[quote=引用 1 楼 tcmakebest 的回复:] 很简单的,设一个全局变量,然后在线程的循环中检测到就退出。
IPAddress ipa = IPAddress.Parse(IP);//IP 地址
                IPEndPoint iep = new IPEndPoint(ipa, port);
                Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                byte[] Mess = new byte[1024];//定义接收数据byte数组
                s.Bind(iep);
                while (true)
                {
                    s.Listen(100000);//链接数
                    Socket m = s.Accept();//阻塞监听端口
                    m.Receive(Mess);
                    message = Encoding.UTF8.GetString(Mess);
                    return message;
                }
但是执行到Accept的时候如果没有连接的时候就一直阻塞端口,那如果在这个时候要退出线程,而且又没有连接连上来那怎么办呢?[/quote] 这个设计问题真多啊,Listen 怎么放到循环中去了? Receive 应该放到子线程中,如果客户端不发数据它也会阻塞。 这里一个客户端连接上来后,就 return 了,s 被遗弃了?m 也被遗弃了? 楼主仍需努力,多看看书吧。
tcmakebest 2013-08-20
  • 打赏
  • 举报
回复
把 Socket s 放到外面,在其他地方关闭它,Accept 就会异常,这里加个 try,catch 中退出。
cvhj 2013-08-20
  • 打赏
  • 举报
回复
引用 1 楼 tcmakebest 的回复:
很简单的,设一个全局变量,然后在线程的循环中检测到就退出。
IPAddress ipa = IPAddress.Parse(IP);//IP 地址
                IPEndPoint iep = new IPEndPoint(ipa, port);
                Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                byte[] Mess = new byte[1024];//定义接收数据byte数组
                s.Bind(iep);
                while (true)
                {
                    s.Listen(100000);//链接数
                    Socket m = s.Accept();//阻塞监听端口
                    m.Receive(Mess);
                    message = Encoding.UTF8.GetString(Mess);
                    return message;
                }
但是执行到Accept的时候如果没有连接的时候就一直阻塞端口,那如果在这个时候要退出线程,而且又没有连接连上来那怎么办呢?
tcmakebest 2013-08-20
  • 打赏
  • 举报
回复
很简单的,设一个全局变量,然后在线程的循环中检测到就退出。
  • 打赏
  • 举报
回复
在你的DoWork处理方法中写个
return;
这就结束了,还用别的什么呢?
  • 打赏
  • 举报
回复
private List<Socket> _clients = new List<Socket>(); byte[] Mess = new byte[1024];//定义接收数据byte数组 s.Bind(iep); s.Listen(100000);//链接数 while (true) { Socket m = s.Accept();//阻塞监听端口 _clients.Add(m); m.Receive(Mess); message = Encoding.UTF8.GetString(Mess); return message; } 这样?
游戏人间 2013-08-20
  • 打赏
  • 举报
回复
7楼应该是正确的。
cvhj 2013-08-20
  • 打赏
  • 举报
回复
那请问大家,如果我把所有连接上服务器的tcp连接都用数组存起来该怎么写?

110,534

社区成员

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

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

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