Проблема в том, что я всегда подключаюсь к (самостоятельной) сервисной стороне - независимо от того, что я пытаюсь - "Операция ввода-вывода была прервана либо из-за выхода потока, либо из-за запроса приложения", на стороне клиента, конечно, соответствующие ошибки, такие как «Существующее соединение было закрыто удаленным хостом», тайм-ауты и так далее.
Я много пробовал в последние дни, но Я не могу от него избавиться.
Клиентская сторона (работает на .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();
}
}
Код: Выделить всё
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple,
InstanceContextMode=InstanceContextMode.PerCall,IncludeExceptionDetailInFaults=true)]
public class Service1 : IMyService
{
public async Task GetData(string whatkey)
{
List mydatalist = new List();
mydatalist= await Task.Run(() =>
{
...
});
return mydatalist;
}
Исключение на стороне сервера:
System.Net.Sockets.SocketException, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Операция ввода-вывода была прервана из-за выхода из потока или запроса приложения
в System.ServiceModel.Channels.SocketConnection.HandleReceiveAsyncCompleted()
в System.ServiceModel.Channels.SocketConnection.OnReceiveAsync(отправитель объекта, SocketAsyncEventArgs eventArgs)
в System.Net.Sockets.SocketAsyncEventArgs.FinishOperationAsyncFailure (SocketError socketError, Int32 bytesTransferred, флаги SocketFlags)
в System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* ownOverlapped)
в System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt) 32 Код ошибки , UInt32 numBytes, NativeOverlapped* pOVERLAP)
System.Net.Sockets.SocketException (0x80004005): операция ввода-вывода была прервана из-за выхода из потока или запроса приложения
3E3
Еще один интересный факт:
Журналы SVCLog показывают мне, что исключение ввода-вывода происходит после интервала времени I. можно определить в
Код: Выделить всё
В этом примере это произойдет в первый раз после 00:02:39.
Моя интерпретация: он закрывает открытые соединения из-за настроек, что вызывает исключение, поскольку операция ReceiveAsync, т.е. был еще открыт.
Мой вопрос: почему client.close() не закрывает его полностью и почему он еще не завершен, когда вызывает событие c_getdatacompleted-event? Почему операция "зависает" на 02:39 минуте и не завершается?
(Если бы я не стал принудительно закрывать через настройки пула соединений, я бы в конечном итоге я получу сотни открытых операций, если для отображения использую netstat i.ex)
Подробнее здесь: https://stackoverflow.com/questions/150 ... ther-a-thr