本文整理汇总了C#中System.Net.Sockets.SocketAsyncEventArgs.TryDispose方法的典型用法代码示例。如果您正苦于以下问题:C# SocketAsyncEventArgs.TryDispose方法的具体用法?C# SocketAsyncEventArgs.TryDispose怎么用?C# SocketAsyncEventArgs.TryDispose使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类System.Net.Sockets.SocketAsyncEventArgs
的用法示例。
在下文中一共展示了SocketAsyncEventArgs.TryDispose方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ReceiveAsync
Boolean ReceiveAsync(SocketAsyncEventArgs se, Boolean io)
{
if (Disposed)
{
Interlocked.Decrement(ref _RecvCount);
se.TryDispose();
throw new ObjectDisposedException(GetType().Name);
}
var rs = false;
try
{
// 开始新的监听
rs = OnReceiveAsync(se);
}
catch (Exception ex)
{
Interlocked.Decrement(ref _RecvCount);
se.TryDispose();
if (!ex.IsDisposed())
{
OnError("ReceiveAsync", ex);
// 异常一般是网络错误,UDP不需要关闭
if (!io && ThrowException) throw;
}
return false;
}
// 如果当前就是异步线程,直接处理,否则需要开任务处理,不要占用主线程
if (!rs)
{
if (io)
ProcessReceive(se);
else
Task.Factory.StartNew(() => ProcessReceive(se));
}
return true;
}
示例2: ProcessReceive
void ProcessReceive(SocketAsyncEventArgs se)
{
if (!Active)
{
se.TryDispose();
return;
}
// 判断成功失败
if (se.SocketError != SocketError.Success)
{
// 未被关闭Socket时,可以继续使用
//if (!se.IsNotClosed())
if (OnReceiveError(se))
{
var ex = se.GetException();
if (ex != null) OnError("ReceiveAsync", ex);
se.TryDispose();
return;
}
}
else
{
// 拷贝走数据,参数要重复利用
var data = se.Buffer.ReadBytes(se.Offset, se.BytesTransferred);
var ep = se.RemoteEndPoint as IPEndPoint;
// 在用户线程池里面去处理数据
//Task.Factory.StartNew(() => OnReceive(data, ep)).LogException(ex => OnError("OnReceive", ex));
//ThreadPool.QueueUserWorkItem(s => OnReceive(data, ep));
// 直接在IO线程调用业务逻辑
try
{
// 估算完成时间,执行过长时提示
using (var tc = new TimeCost("{0}.OnReceive".F(GetType().Name), 1000))
{
tc.Log = Log;
OnReceive(data, ep);
}
}
catch (Exception ex)
{
if (!ex.IsDisposed()) OnError("OnReceive", ex);
}
}
// 开始新的监听
if (Active && !Disposed)
ReceiveAsync(se, true);
else
se.TryDispose();
}
示例3: ProcessSend
void ProcessSend(SocketAsyncEventArgs se)
{
if (!Active)
{
se.TryDispose();
return;
}
// 判断成功失败
if (se.SocketError != SocketError.Success)
{
// 未被关闭Socket时,可以继续使用
//if (!se.IsNotClosed())
{
var ex = se.GetException();
if (ex != null) OnError("SendAsync", ex);
se.TryDispose();
//if (se.SocketError == SocketError.ConnectionReset) Dispose();
if (se.SocketError == SocketError.ConnectionReset) Close("SendAsync " + se.SocketError);
return;
}
}
// 发送新的数据
if (Interlocked.CompareExchange(ref _Sending, 0, 1) == 1) CheckSendQueue(true);
}