Проблема в том, что я всегда попадаю на (самостоятельную) сторону службы - независимо от того, что я пытаюсь - "Операция ввода-вывода была прервана либо из-за выхода потока, либо из-за запроса приложения", на стороне клиента, конечно, соответствующие ошибки, такие как «Существующее соединение было закрыто удаленным хостом», таймауты и т. д.
Я много пробовал за последние дни, но не могу от него избавиться.
Клиентская сторона (работает на .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* NativeOverlapped)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
System.Net.Sockets.SocketException (0x80004005): операция ввода-вывода была прервана из-за выхода из потока или запрос приложения
3E3
Еще один интересный факт:
Журналы SVCLog показывают мне, что исключение ввода-вывода происходит через промежуток времени, который я могу определить в
Код: Выделить всё
В этом примере это произойдет в первый раз после 00:02:39.
Моя интерпретация: он закрывает открытые соединения из-за имеющихся настроек, что вызывает исключение, поскольку операция ReceiveAsync, т.е. был еще открыт.
У меня вопрос: почему client.close() не закрывает его полностью и почему он еще не завершен, когда вызывает событие c_getdatacompleted-event? Почему операция «зависает» в течение 02:39 минут и не завершается?
(Если я не буду принудительно завершать работу через настройки пула соединений, у меня в конечном итоге будут сотни открытых операций, если я использую netstat i.ex. для отображения)
Подробнее здесь: https://stackoverflow.com/questions/150 ... ther-a-thr
Мобильная версия