积极答复者
关于用 DataWriter 向 StreamSocket 写入数据,调用 StoreAsync 时发生 ObjectDisposedException 异常

问题
-
由于是为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 的返回值。这个异常是因为什么引起的呢
答案
-
额,发现问题了,我忘记调用 writer.DetachStream(), 导致 DataWriter 释放的时候把 StreamSocket 的 OutputStream 给一并销毁了。所以再次调用的时候会抛这个异常。
本来是调了的,后来改代码时一不小心删掉了然后给忘记了,请大家无视我吧。。
- 已标记为答案 Terender Odin 2014年8月12日 8:50
全部回复
-
代码改造成这样,但是还是一样会频繁的发生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); });
-
额,发现问题了,我忘记调用 writer.DetachStream(), 导致 DataWriter 释放的时候把 StreamSocket 的 OutputStream 给一并销毁了。所以再次调用的时候会抛这个异常。
本来是调了的,后来改代码时一不小心删掉了然后给忘记了,请大家无视我吧。。
- 已标记为答案 Terender Odin 2014年8月12日 8:50