文档章节

奇怪的问题 thread里面使用了await,然后abort..

卜霞森
 卜霞森
发布于 2015/02/11 16:20
字数 275
阅读 28
收藏 0

如题,自己做小工具,面向单个socket的tcp连接,使用thread处理TcpListener以及后续的数据接收,中间用到了await 和AcceptSocketAsync,然后我想在正在等待的时候取消listener状态。

目前使用的方式为直接thread.abort

但是在捕获到System.ObjectDisposedException

大致是说System.Net.Socket对象在企图对ta执行Dispose的时候已经被释放..



    class TcpServer_view_module : INotifyPropertyChanged
    {
...
        private TcpListener tcp_listener = null;
        private Socket tcp_socket = null;
...
        private async void thread_process_tcp_listener()
        {
            try
            {
                while (true)
                {
                    state = state_tcp_serve.waiting_client;
                    tcp_listener.Start(1);
                    tcp_socket = await tcp_listener.AcceptSocketAsync();
                    tcp_listener.Stop();
                    state = state_tcp_serve.connected;

                    if (tcp_socket != null)
                    {
                        while (true)
                        {
                            byte[] buffer = new byte[2048];
                            int len = tcp_socket.Receive(buffer);
                            if (len == 0)
                            {   //socket disconnect
                                break;
                            }
                            else
                            {
                                DataReceived(buffer, len);
                            }
                            tcp_socket.Dispose();
                        }
                    }
                }
            }
            catch (System.ObjectDisposedException dispose_e)
            {
...
            }
            catch (SystemException se)
            {
...
                state = state_tcp_serve.not_started;
            }
        }
...
        private void on_click()
        {
                switch (state)
                {
                    case state_tcp_serve.not_started:
...
                        thread_listener = new Thread(new ThreadStart(thread_process_tcp_listener));
                        thread_listener.Start();
                        break;

                    case state_tcp_serve.waiting_client:
                        tcp_listener.Stop();
                        if (thread_listener != null)
                        {
                            thread_listener.Abort();
                        }
                        if (tcp_socket != null)
                        {
                            tcp_socket.Dispose();
                            tcp_socket = null;
                        }
                        state = state_tcp_serve.not_started;
                        break;

                    case state_tcp_serve.connected:
                        state = state_tcp_serve.not_started;
                        if (thread_listener.IsAlive)
                        {
                            thread_listener.Abort();
                        }
                        if (tcp_socket != null)
                        {
                            tcp_socket.Dispose();
                            tcp_socket = null;
                        }
                        break;
                }            
        }


很奇怪的问题,大概有几个怀疑的点:

1、await虽然是语法糖,但是实际上还是拆解成异步来处理的,所以会导致异步操作未完成

2、

© 著作权归作者所有

共有 人打赏支持
卜霞森
粉丝 1
博文 50
码字总数 32877
作品 0
深圳
程序员
netty handler 里面代码需要同步

大家好! 我写的netty handler里面需要连接另外一个server,然后在后续的消息接收中对接收到的信息进行转发,但是netty的connect是异步的,handler里面又不能使用connectFuture.await()操作来等待...

xinglu
2012/03/19
1K
0
java多线程使用条件对象的时候,为什么建议用while来判断?

在看java核心技术讲到多线程中用条件对象,说到通常对await的调用应该在 while(!(ok to proceed)){condition.await();} 我奇怪为什么推荐使用while来判断,可不可以用if 在代码中实验了下,在...

Mr_Sky
2014/08/04
1K
2
c# 温故而知新: 线程篇(一)

c# 温故而知新: 线程篇(一) Thread 目录: 目录: 1 线程基础的简单介绍 2 线程同步与线程异步的简单介绍 3 前台线程与后台线程的简单介绍 4 细说下Thread 最为关键的构造函数 5 细说下Thr...

付翔
2013/01/08
0
0
改善C#程序的建议7:正确停止线程

开发者总尝试对自己的代码有更多的控制。“让那个还在工作的线程马上停止下来”就是诸多要求中的一种。然而事与愿违,这里面至少存在两个问题: 第一个问题是:正如线程不能立即启动一样,线...

文艺小青年
2017/06/08
0
0
使用Await减少回调嵌套

在开发的时候,有时候需要发很多请求,然后经常会面临嵌套回调的问题,即在一个回调里面又嵌了一个回调,导致代码层层缩进得很厉害,如下代码所示: 这样的代码看起来有点吃力,这种异步回调...

人人网FED
2017/10/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

安全管理标准

安全生产严重等级分类: 故障频次: 风险等级矩阵:

乔老哥
16分钟前
1
0
数据结构“树”的相关微视频

今天在腾讯视频上闲逛,然後发现一个叫“岚人”的用户上传了几段小视频,基本上都在5分钟以内,讲解了关于树的一些结构和算法。零代码,非常适合初学者入门。不过,对于老鸟来说,这也是非常...

Iridium
28分钟前
0
0
10-利用思维导图梳理JavaSE-Java 集合

10-利用思维导图梳理JavaSE-Java 集合 主要内容 1.Collection接口 2.Set接口 2.1.Set接口概述 2.2.HashSet类 2.3.TreeSet类 2.4.SortedSet接口 3.List接口 3.1.List接口概述 3.2.ArrayList类...

飞鱼说编程
39分钟前
3
0
活动推荐|互联网3.0与区块链新时代论坛(北京)

1 时间地点 **时间:**9月22日 14:00 - 18:00 地点:(北京海淀)西大街70号 3w咖啡 二层 2 活动详情 Harmony创始人Stephen及团队将介绍他们的区块链分片扩容技术。Stephen曾任Apple地图服务...

HiBlock
57分钟前
1
0
如何优雅的删除Redis的大key

关于Redis大键(Key),我们从[空间复杂性]和访问它的[时间复杂度]两个方面来定义大键。前者主要表示Redis键的占用内存大小;后者表示Redis集合数据类型(set/hash/list/sorted set)键,所含有的...

IT--小哥
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部