Таймауты в сокетах Silverlight - PullRequest
9 голосов
/ 29 апреля 2011

Я использую Socket s в приложении Silverlight для потоковой передачи данных с сервера на клиент.

Однако я не совсем уверен, как обрабатываются таймауты в Silverlight Socket.
В документации я не вижу ничего подобного ReceiveTimeout для Silverlight.

  • Возможны ли определенные пользователем таймауты?Как я могу установить их?Как я могу получать уведомления, когда время операции отправки / получения истекло?
  • Существуют ли таймауты по умолчанию?Насколько они велики?
  • Если нет тайм-аутов: какой самый простой способ реализовать эти тайм-ауты вручную?

Ответы [ 3 ]

5 голосов
/ 09 мая 2011

Я проверил класс Socket в Reflector, и нет ни одного соответствующего вызова setsockopt, который имеет дело с тайм-аутами - за исключением метода Dispose. Похоже, Silverlight просто полагается на тайм-аут по умолчанию WinSock API.

Класс Socket также содержит закрытый метод SetSocketOption, который вы можете вызывать с помощью отражения - хотя весьма вероятно, что вы столкнетесь с исключением безопасности.

4 голосов
/ 11 мая 2011

Так как я не смог найти какое-либо хорошее решение, я решил проблему вручную, создав System.Threading.Timer с кодом, подобным следующему:

System.Threading.Timer t;
bool timeout;

[...]

// Initialization
t = new Timer((s) => {
    lock (this) {
        timeout = true;
        Disconnected();
    }
});

[...]

// Before each asynchronous socket operation
t.Change(10000, System.Threading.Timeout.Infinite);

[...]

// In the callback of the asynchronous socket operations
lock (this) {
    t.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
    if (!timeout) {
        // Perform work
    }
}

Это также обрабатывает случаи, когда происходит тайм-аут, которыйсоздается простым запаздыванием и позволяет немедленному возврату обратного вызова, если операция заняла слишком много времени.

0 голосов
/ 28 ноября 2012

Я решил эту проблему для своего проекта sharpLightFtp вроде:

Создан класс , который добавляется в UserToken -предложениеэкземпляра System.Net.Sockets.SocketAsyncEventArgs и имеет System.Threading.AutoResetEvent , который используется для получения сигнала после ConnectAsync,ReceiveAsync и SendAsync с тайм-аутом (например, здесь : строка 22 для получения пользовательского расширенного SocketAsyncEventArgs экземпляра, строка 270 для создания иусиление экземпляра SocketEventArgs, строки 286 для отправки сигнала и строки 30 для ожидания)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...