none
关于用 DataWriter 向 StreamSocket 写入数据,调用 StoreAsync 时发生 ObjectDisposedException 异常 RRS feed

  • 问题

  •  由于是为Unity3D做Windows 应用商店版的网络通信插件,不能使用 await ,所以使用如下代码来发送消息

        
                DataWriter writer = new DataWriter(m_pobjSocket.OutputStream);
                    writer.WriteBytes(buffer);
                    //Debug.WriteLine("写入socket");
                    
                    DataWriterStoreOperation act = writer.StoreAsync();
                    //Debug.WriteLine("异步存入");
                    act.Completed += (IAsyncOperation<uint> asyncInfo, AsyncStatus asyncStatus) =>
                    {
                        if (asyncInfo.ErrorCode != null)
                        {
                            Debug.WriteLine(asyncInfo.ErrorCode);
                            m_bConnected = false;
                            sendOP.exp = new SocketException(asyncInfo.ErrorCode);
                        }
                        else
                            sendOP.bytes = (int)asyncInfo.GetResults();
                        sendOP.done.Set();
                        if (sendOP.ar != null && sendOP.ar.Callback != null)
                            sendOP.ar.Callback(sendOP.ar);
                    };
    
    但是在发送时调用 StoreAsync() 的时候频繁抛出 ObjectDisposedException 异常,我不清楚是什么原因导致这个异常,网上查到的说法是发送的线程已经关闭,但是因为异常导致我拿不到返回的 DataWriterStoreOperation 对象,无法获得 GetResults 的返回值。这个异常是因为什么引起的呢
    2014年8月12日 4:25

答案

  • 额,发现问题了,我忘记调用 writer.DetachStream(), 导致 DataWriter 释放的时候把 StreamSocket 的 OutputStream 给一并销毁了。所以再次调用的时候会抛这个异常。

    本来是调了的,后来改代码时一不小心删掉了然后给忘记了,请大家无视我吧。。

    2014年8月12日 8:46

全部回复

  • 代码改造成这样,但是还是一样会频繁的发生ObjectDisposedException异常

    DataWriter writer = new DataWriter(m_pobjSocket.OutputStream); writer.WriteBytes(buffer); Task.Run(async () => { try { uint count = await writer.StoreAsync(); await writer.FlushAsync(); sendOP.bytes = (int)count; sendOP.done.Set(); } catch (ObjectDisposedException e) { Debug.WriteLine(e.Message); Debug.WriteLine(e.ObjectName); Debug.WriteLine(e); } catch (Exception e) { Debug.WriteLine(e); m_bConnected = false; sendOP.exp = e; } if (sendOP.ar != null && sendOP.ar.Callback != null) sendOP.ar.Callback(sendOP.ar); });


    2014年8月12日 7:06
  • 额,发现问题了,我忘记调用 writer.DetachStream(), 导致 DataWriter 释放的时候把 StreamSocket 的 OutputStream 给一并销毁了。所以再次调用的时候会抛这个异常。

    本来是调了的,后来改代码时一不小心删掉了然后给忘记了,请大家无视我吧。。

    2014年8月12日 8:46
  • 额,发现问题了,我忘记调用 writer.DetachStream(), 导致 DataWriter 释放的时候把 StreamSocket 的 OutputStream 给一并销毁了。所以再次调用的时候会抛这个异常。

    本来是调了的,后来改代码时一不小心删掉了然后给忘记了,请大家无视我吧。。

    顺便吐槽一下,很多流或者缓冲区相关的功能类都是这样,在自身被析构的时候会把被管理的缓冲区给同时销毁,即使这个缓冲区是外部传入的,这个很奇怪啊,不符合缓冲区管理的原则。

    2014年8月12日 8:50