![](/img/trans.png)
[英]I/O operation has been aborted because of either a thread exit or an application request in serial port
[英]No matter what I try: The I/O operation has been aborted because of either a thread exit or an application request
我尝试构建一个简单的 async net tcp wcf 工具,它将打开连接、发送命令、接收答案(包含 0-10 个字符串句子的列表)、关闭连接。
问题是,我总是在(自托管)服务端 - 无论我尝试什么 - “I/O 操作已因线程退出或应用程序请求而中止” ,当然在客户端相应诸如“现有连接已被远程主机关闭”和超时等错误。
过去几天我尝试了很多,但我无法摆脱它。
客户端(在 .NET 4.0 上运行,大约每秒调用一次):
void callservice(string mykey) {
ServiceReference1.Client c = new ServiceReference1.Client();
c.GetDataCompleted += c_GetDataCompleted;
try {
c.GetDataAsync(mykey);
}
catch (FaultException aa)
{
c.Abort();
}
}
private void c_GetDataCompleted(object sender, ServiceReference1.GetDataCompletedEventArgs e)
{
ServiceReference1.Client c = (ServiceReference1.Client)sender;
c.GetDataCompleted -= c_GetDataCompleted;
try
{
if (e.Result != null && e.Result.Length > 0)
{
... }
c.Close();
}
catch (Exception) {
c.Abort();
}
}
服务器端(在 .NET4.5 上运行):
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple,
InstanceContextMode=InstanceContextMode.PerCall,IncludeExceptionDetailInFaults=true)]
public class Service1 : IMyService
{
public async Task<List<string>> GetData(string whatkey)
{
List<string> mydatalist = new List<string>();
mydatalist= await Task.Run<List<string>>(() =>
{
...
});
return mydatalist;
}
那里出了什么问题? 难道它根本与 WCF 无关吗? 会是什么呢?
服务器端异常:
System.Net.Sockets.SocketException, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 由于 System.ServiceModel.Channels.SocketConnection 的线程退出或应用程序请求,I/O 操作已中止。 HandleReceiveAsyncCompleted() 在 System.ServiceModel.Channels.SocketConnection.OnReceiveAsync(Object sender, SocketAsyncEventArgs eventArgs) 在 System.Net.Sockets.SocketAsyncEventArgs.FinishOperationAsyncFailure(SocketError socketError, Int32 bytesTransferred, SocketFlags flags) 在 System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback (UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped) 在 System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) System.Net.Sockets.SocketException (0x80004005):I/O 操作已中止,因为线程退出或应用程序请求 3E3
另一个有趣的事实:SVCLogs 告诉我 I/O 异常发生在我可以在
<connectionPoolSettings groupName="default" leaseTimeout="00:03:00"
idleTimeout="00:02:39" maxOutboundConnectionsPerEndpoint="20" />
设置。 在本例中,它将在 00:02:39 之后第一次发生。 我的解释:由于那里的设置,它会关闭打开的连接,这会导致异常,因为 ReceiveAsync 操作 i.ex。 仍然开放。
到目前为止,我的问题是为什么 client.close() 没有完全关闭它,为什么它在调用 c_getdatacompleted-event 时还没有完成? 为什么手术“挂出”到 02:39 分钟还没有结束?
(如果我不通过连接池设置强制关闭,如果我使用 netstat i.ex. 显示,我最终会打开数百个操作)
异步 WCF 操作 ( AsyncPattern=true
) 使用异步编程模型实现。 也就是说,您使用两个异步操作(“BeginOperation”和“EndOeration”)实现一个操作(“Operation”)。 客户端可以用Task
包装这些操作(可能是FromAsync
重载)
例如:
[ServiceContract]
public interface ISampleTaskAsync
{
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginDoWork(int count, AsyncCallback callback, object state);
int EndDoWork(IAsyncResult result);
}
WCF 合同不返回Task<T>
然后,在客户端上,您可以执行以下操作:
var proxy = new Services.SampleTaskAsyncClient();
object state = "This can be whatever you want it to be";
var task = Task<int>.Factory.FromAsync(proxy.BeginDoWork,
proxy.EndDoWork, 10, state);
有关更多信息,请参阅:
如果你想使用Task<T>
,我相信你不需要AsyncPattern=true
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.