PDA

View Full Version : سوال: چطور یک شی از کلاس رو از داخل خودش کلاس Destruct کنم ؟



kavy666
چهارشنبه 25 خرداد 1390, 19:37 عصر
سلام به دوستان
من اولین بارمه که اینجا پست میزارم
حسابی گیر کردم امیدوارم کسی به داد من برسه

من یه While بی نهایت دارم که در شرایطی برای من یک شی از کلاسی که تعریف کردم میسازه.
اول میخوام بدونم که این شی ها میتونی هر کدوم واسه خودشون یک اسم داشته باشن که بتونم راحت شناسایشون کنم؟
دوم این شی هایی که ایجاد میشن رو در شرایط خاصی مثلا یک try اتفاق میوفته چون همه کلاسهام به یک اسم هستند از داخل همین کلاس Destruct کنم؟

مثال:



public class obj
{
public void cl()
{
try
{

}
catch(Exeption)
{
// classam ro mikham inja Destruct konam

}
}
}


میخوام وقتی که درtry برنام خطایی رخ داد در catch کل این شی که از این کلاس هست رو از حافظه حذف کنه؟
این الان خیلی برام مهمه لطفا کمک کنیین ممنون .

exlord
چهارشنبه 25 خرداد 1390, 20:48 عصر
برای نام گزاری میتونین از یه Dictionery اسفاده کنین و یا اینکه توی خود کلاس یه پراپرتی Name بزارین ...
برای Destruct کردن هم ...
public class obj : IDisposable
{
public void cl()
{
try
{

}
catch (Exception)
{
this.Dispose();
}
}

public void Dispose()
{
//object haye sakhte shode dar in class ro Dispose ya null konin
}
}

kavy666
چهارشنبه 25 خرداد 1390, 22:25 عصر
برای نام گزاری میتونین از یه Dictionery اسفاده کنین و یا اینکه توی خود کلاس یه پراپرتی Name بزارین ...
برای Destruct کردن هم ...
public class obj : IDisposable
{
~obj()
{
MessageBox.Show("obj closed")
}
public void cl()
{
try
{

}
catch (Exception)
{
this.Dispose();
}
}

public void Dispose()
{
//object haye sakhte shode dar in class ro Dispose ya null konin
}
}

خیلی ممنون از exlord عزیز
من این کا رو هم انجام داده بودم و دوباره انجام دادم ولی نتیجه نگرفتم
مگه وقتی یک کلاس desteract میشه نباید Finalize اجرا بشه ؟
اگر این طور هست، من از اینجا میفهمم که شی مورد نظرم حذف نشده.
که این کار انجام نمیشه مگر موقع بستن فرمم که زمان خروج از برنامه است :ناراحت:

exlord
چهارشنبه 25 خرداد 1390, 23:10 عصر
ببینین مشکل اینجاست که شما تو .Net نمیتونی یه object رو به ضورت دستی Destruct کنی ....
وقتی object از بین میره که هیچ Reference ای بهش اشاره نکنه ... که از توی خود object من فکر نمیکنم بشه Reference ای که بهش اشاره میکنه رو از بین برد ....
نمیدونم توی اون حلقه تون چجوری استفاده میکنین ولی همونجا باید Reference رو مساوی Null قرار بدین ... چیز دیگه ای به ذهنم نمیرسه ...

kavy666
پنج شنبه 26 خرداد 1390, 03:50 صبح
من قصد دارم یک برنامه سرور بنویسم که همه کلاینتها به وسیله این برنامه بتونن با هم ارتباط داشته باشن
من پروژه رو آپلود کردم یک نگاهی کنین اگه تونستین راهنمایی کنین خیلی ممنون میشم
با VS 2010 هست
https://rapidshare.com/files/745479402/ServerApplication.zip

exlord
پنج شنبه 26 خرداد 1390, 11:13 صبح
کدتونو به این صورت اصلاح کردم ....
یه کلاس برای سرور اضافه کردم :
internal class Server : IDisposable
{
private TcpListener tcpListener;
private Thread listenThread;
private List<Client> _clients;

public Server(int port)
{
_clients = new List<Client>();
this.tcpListener = new TcpListener(IPAddress.Any, port);
this.listenThread = new Thread(new ThreadStart(ListenForClients));
this.listenThread.Start();
}

private void ListenForClients()
{
this.tcpListener.Start();

while (true)
{
TcpClient client = null;
try
{
client = this.tcpListener.AcceptTcpClient();
this._clients.Add(new Client(client, this));
}
catch (SocketException)
{
if (client != null)
client.Close();
}
}
}

public void DisposeClient(Client c)
{
this._clients.Remove(c);
c.Dispose();
c = null;
// alan hich referency be Client eshare nemikone va GC uno Collect mikone
}

#region IDisposable Members

public void Dispose()
{
this.tcpListener.Stop();
this.listenThread.Abort();
foreach (Client item in this._clients)
{
item.Dispose();
}
_clients.Clear();
_clients = null;
}

#endregion
}

و کلاینت هم به این شکل :
internal class Client : IDisposable
{
private TcpClient _tcpClient;
private Server _server;
private Thread _clientThread;

public Client(TcpClient tcpClient, Server server)
{
this._tcpClient = tcpClient;
this._server = server;

_clientThread = new Thread(new ThreadStart(HandleClientComm));
_clientThread.Start();
}

private void HandleClientComm()
{
NetworkStream clientStream = this._tcpClient.GetStream();

byte[] message = new byte[4096];
int bytesRead;

while (true)
{
bytesRead = 0;

try
{
//blocks until a client sends a message
bytesRead = clientStream.Read(message, 0, 4096);
}
catch
{
//a socket error has occured
break;
}

if (bytesRead == 0)
{
//the client has disconnected from the server
break;
}

//message has successfully been received
ASCIIEncoding encoder = new ASCIIEncoding();
System.Diagnostics.Debug.WriteLine(encoder.GetStri ng(message, 0, bytesRead));
}

//tuye halge age breack nashe in gesmate hichvagt ejra nemishe
this._server.DisposeClient(this);
}


#region IDisposable Members

public void Dispose()
{
this._tcpClient.Close();
this._clientThread.Abort();
}

#endregion
}

و نهایتا توی فرم :

private Server _server;
private void button2_Click(object sender, EventArgs e)
{
_server = new Server(Int32.Parse(textBox1.Text));
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
_server.Dispose();
}

kavy666
پنج شنبه 26 خرداد 1390, 14:54 عصر
خیلی ممنون
یکم کلاینت ها با هم مشکل دارن باید برسی کنم
سئوال زیاد دارم اگه شد بازم مزاحمتون میشم.
کارتون درسته.