нужен объект из удаленного класса? - PullRequest
0 голосов
/ 27 марта 2012

Я знаю, что мне нужно избавиться от всех неуправляемых ресурсов в классе или форме ... но что, если я передал сокет классу, то я хочу избавиться от класса и сохранить сокет!

в form1.cs я использую сокет TCP для чтения команд с сервера и у меня есть класс, который отправляет команды на сервер, используя тот же сокет

, поэтому, когда я инициализировал класс .. я передал сокет iиспользовать в form1 к классу .. я задаюсь вопросом, располагает ли сокет в form1.cs, если я вызвал socket.dispose() из класса?

я должен избавиться от сокета, когда я располагаю класс, или просто socket = null будет хорошо? (но сокет нужен, даже если я хочу избавиться от класса, потому что я хочу продолжать получать команды с сервера).

класс:

public class TM
{
    Socket client;
    public TM(Socket socket)
    {
        client = socket;
    }

    public void Dispose()
    {
        client = null; // or client.Dispose()

        GC.SuppressFinalize(this);
    }

    ~TM()
    {
        Dispose();
    }

 }

form1.cs

TM tm = new TM(client);
private void whatever() 
{

StreamReader sr = new StreamReader(new NetworkStream(client));
while ((cmd = sr.ReadLine()) != null)   //this socket need to keep receiving commands even if i disposed the class
{
     Console.WriteLine(cmd);
}
}

private void Button1_Click(object sender, EventArgs e)
{
        tm.Dispose();
}

извините за мой плохой английский, и я надеюсь, что вы поняли мою точку зрения .. заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

Во-первых, если вы собираетесь использовать Dispose, просто внедрите IDisposable. MSDN показывает правильный способ реализации шаблона, который вы пытаетесь сделать.

К актуальному вопросу: поскольку вы на самом деле не выбрасываете Socket в Dispose из TM, он не закрывается и не удаляется. То, как это показано, реализовано, и сам вызывающий может управлять жизненным циклом socket. Если TM не отвечает за создание сокета, он также не должен отвечать за очистку сокета. Это может привести к трудным отслеживанию ошибок и неожиданному поведению.

1 голос
/ 27 марта 2012

Ваш код в классе не располагает сокетом. И так и должно быть, потому что он его не создал. Даже если объект вашего класса TM уничтожен, сокет будет доступен в соответствии с вашим кодом.

0 голосов
/ 27 марта 2012

Нет, позвонив tm.Dispose(); ваше гнездо client не будет утилизировано.Вам просто нужно позвонить client.Close(), когда вы закончите с сокетом, чтобы закрыть его и утилизировать.

...