Я пытаюсь подключиться к своему серверу с помощью TcpClient.BeginConnect / TcpClient.EndConnect
комбо.Однако некоторые вещи не работают должным образом.
Сценарий таков:
- Вызов на сервер
TcpClient.BeginConnect
- намеренно отключен (в целях тестирования) - таким образом, никакое соединение не может быть установлено.
- Я закрываю приложение (
client.Close()
вызывается в процессе, закрывает сокет, который, в свою очередь, останавливает асинхронную операцию ) TcpClient
соединение метод обратного вызова происходит, давая IAsyncResult
- вызов метода
TcpClient.EndConnect
с указанным IAsyncResult
NullReferenceException
происходит в EndConnect
(? ) - Так как последняя форма (окно) была закрыта, приложение должно закрыться - однако этого не происходит, по крайней мере, пока операция
BeginConnect
не завершится (что странно, так как обратный вызов уже был вызван).
Здесь происходит то, что NullReferenceException
перехватывается.Как видно из рисунка выше, ни client
, ни ar
не являются null
.Проблема в том, что в документации MSDN для EndConnect не упоминается случай, в котором выдается это исключение.
Так что в принципе я понятия не имею, что происходит.Проблема в том, что я вынужден ждать закрытия приложения (как будто операция подключения все еще ожидает тайм-аут). Если сервер подключен к сети, он просто подключается и отключается .
Что означает NullReferenceException
в этом контексте ?Как избежать операции BeginConnect
для блокировки закрытия приложения в случае невозможности установить соединение?
Дополнительные примечания ( запрашивается в комментариях ):
Вот код для создания клиента (клиент является переменной-членом:
public void Connect()
{
try
{
lock (connectionAccess)
{
if (State.IsConnectable())
{
// Create a client
client = new TcpClient();
client.LingerState = new LingerOption(false, 0);
client.NoDelay = true;
State = CommunicationState.Connecting;
client.BeginConnect(address, port, onTcpClientConnectionEstablished, null);
}
else
{
// Ignore connecting request if a connection is in a state that is not connectable
}
}
}
catch
{
Close(true);
}
}
Также метод Close:
public void Close(bool causedByError)
{
lock (connectionAccess)
{
// Close the stream
if (clientStream != null)
clientStream.Close();
// Close the gateway
if (client != null)
client.Close();
// Empty the mailboxes
incomingMailbox.Clear();
outgoingMailbox.Clear();
State = causedByError ? CommunicationState.CommunicationError : CommunicationState.Disconnected;
}
}