После выполнения метода Client.main выбрасывается исключение ObjectDisposedException (Доступ к ликвидированному объекту невозможен). Метод main предназначен для установления соединения с сервером, планируется использовать подключенный к серверу объект client в методах для отправки и получения данных на стороне клиента. Если я оберну код в блоке try в using, то ошибка исчезнет, но мне нужна возможность использовать данный TcpClient в других методах класса клиента.
Не понятна суть этой ошибки, почему объект TcpClient при выходе из метода main уничтожается, хотя он объявлен как член класса. Также непонятно, почему это исключение пропадает при закрытии сетевого потока и удалении экземпляра TcpClient в конце метода. Буду благодарен, если кто-то ответит на эти вопросы. В конце кода привел метод принятия запроса подключения на стороне сервера (метод Server.Listen).
internal static async void main()
{
try
{
client = new TcpClient(AddressFamily.InterNetwork);
IPAddress ipAddress = IPAddress.Parse(Form1.frm1.textBox3.Text);
await client.ConnectAsync(ipAddress, port);
if (client.Connected)
Form1.frm1.textBox2.AppendText("Подключение к серверу выполнено" + Environment.NewLine);
stream = client.GetStream();
}
catch (Exception ex)
{
Form1.frm1.textBox2.AppendText(ex.Message + Environment.NewLine);
Disconnect();
}
}
static internal async void Listen()
server = new TcpListener(localAddr, port);
server.Start();
while (true)
{
try
{
if (server.Pending())
{
TcpClient client = await server.AcceptTcpClientAsync();
ClientObjects clientObject = new ClientObjects(client);
clientObject.Process();
}
}
catch (Exception e)
{
Form1.frm1.textBox2.BeginInvoke(new Action(() => { Form1.frm1.textBox2.AppendText(e.Message + Environment.NewLine); }));
break;
}
}
static internal void Disconnect()
{
if (stream != null)
stream.Close(); //отключение потока
if (client != null)
client.Close(); //отключение клиента
}
UPD: Вынес инициализацию объекта TcpClient из блока try-catch. Ошибка сохранилась. Добавил сюда код метода Disconnect
вынести инициализацию client = new TcpClient(AddressFamily.InterNetwork); из блока try{} выше, просто первой строкой main()
описание try-catch
Из блока try следует инициализировать только те переменные, которые в нем объявлены. ... Попытка использовать эту переменную вне блока try... приведет к ошибке компиляции.
как бы try-catch должен "прибрать за собой" :) видимо client после выхода из блока try{} выполняет Dispose(), т.к. класс TcpClient наследует интерфейс IDisposable... но этот экземпляр является полем другого ещё существующего объекта, его ресурсы освобождать рано (если это и делать, то только "сверху вниз").
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости