PDA

View Full Version : سوال: ایا نیاز هست در داخل توابع ابجکت هام رو دیسپوز کنم؟



hercool
سه شنبه 30 مهر 1392, 19:39 عصر
سلام خدمت دوستان
یه سوال دارم
من تو برنامم چندین باتن دارم که ممکنه در هر بار باز شدن برنامه 1000 بار روی این کلید ها کلیک بخوره
ایا نیاز هست که من در اخر هر تابعی که نوشتم ابجکت هایی که ساختم را دیسپوز کنم یا نه خود برنامه ای که ساختم خودش به صورت خودکار بعد از انجام هر بار فراخوانی ان باتن و اجرای توابع زیر مجموعش ابجکت ها رو دیسپوز می کنه
برای مثال


private void test(string s){
SqlDataAdapter adapter = new SqlDataAdapter();
SqlCommand command = new SqlCommand(s);
command.Connection = con;
con.Close();
command.Connection.Open();
command.CommandType = CommandType.StoredProcedure;
adapter.SelectCommand = command;
}


ایا نیاز هست اخر توابع این ابجکت ها رو دیسپوز کنم؟

saied_max
سه شنبه 30 مهر 1392, 20:10 عصر
معمولا وقتی به پایان دستورات می رسه ({ ) کلیه متغییر ها و آبجکت های تعریف شده پاک میشن یا جز garbage میشن. اما فکر کنم اگه dispose() کنی از توی garbage یا همان اطلاعات آزاد شده رم نشه استفاده کرد و یه جورایی null بشه.

naghshineh m&h
سه شنبه 30 مهر 1392, 21:22 عصر
با عرض سلام و احترام در نسخه C# 4 مایکروسافت اعلام کرده که در این نسخه شی ها یی که با آنها کار نمی شود به طور تصادفی انتخاب و حذف می شوند برای اثبات آن نیز یک آرایه ساخته و به تعداد زیاد در آن شی ایجاد کرد و در یک حلقه اثبات کرد که شی ها یی بلا استفاده حذف می شوند و من هم تست کردم و حل بود نکته ای که مهم است : دو سال پیش نرم افزاری را نوشتم برای یک کلینیک که بیش از 1000 پذیرش در روز انجام می شد بعد از دوروز در هنگام چاپ ویزیت به طور تصادفی نرم افزار هنگ می کرد خلاصه به خدا رسیدم با اون حجم بیمار تا ایرادش را پیدا کردم مشکلش این بود که شی که من برای چاپ ایجاد می کردم در (Crystal Report) چون Dispose نمی کردم در Temp سیستم می موند وموقع چاپ داستان درست شده بود خلاصه که درC# 2012 همچین مشکلی نیست ولی اگر با اشیاء که متعلق به مایکروسافت نیست کار می کنید حتما Dispose کنید در غیر اینصورت مشکلی نیست

FastCode
سه شنبه 30 مهر 1392, 21:54 عصر
همه ی آبجکت ها رو نه.ولی اونهایی که توی نمونه کدتون آوردید رو بله.چون به منابع سیستمی دسترسی دارند
و یادتون باشه که این کار رو حتما در بلاک finally انجام بدید.برای ایجاد سادگی بیشتر در این کار از دستور using استفاده میشه که مجموعه ی یک try/finally و dispose هست.

راجع به روش کار GC تحقیق کنید.دیدتون رو در برنامه نویسی داتنت تغییر میده.

hercool
سه شنبه 30 مهر 1392, 22:13 عصر
بیشتر شی های مربوط به همین اتصال به دیتابیس هست که نوشتم

fastcode ممنون بابت راهنماییت
منظورت از خط دوم اینه که وقتی using رو در تابع میاریم خودش بعد انجام کار(تمام شدن کار باتن) خودش dispose میشه؟

FastCode
سه شنبه 30 مهر 1392, 22:45 عصر
بله.
برای اطلاعات و نمونه کد بیشتر:
https://www.google.com/search?q=using+%3D+try+finally+dispose

hercool
چهارشنبه 01 آبان 1392, 09:16 صبح
ممنون fast code عزیز
دارم اونا رو می خونم
فقط یه مشکلی فعلا روی کد هام دارم برای مثال من این کد رو نوشتم و مشکل اینه که من ابجکتها هایی رو که در تابع خودم نوشتم رو نمی تونم در بلوک finally بهش دسترسی داشته باشم و اونا رو دیپوز کنم
میشه در این زمینه راهنماییم کنی
public partial class Form1 : Form
{
int codepersonally;
string namepersonal;
SqlConnection con=new SqlConnection("Data Source=masoud;Initial Catalog=testdatabase;Integrated Security=True");
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
savesellmarket("tablepersonally");
}

private void savesellmarket(string s)
{
try
{
SqlDataAdapter adapter = new SqlDataAdapter();
SqlCommand command = new SqlCommand(s);
command.Connection = con;
command.Connection.Open();
command.CommandType = CommandType.StoredProcedure;
adapter.SelectCommand = command;
for (int i = 0; i < 3; i += 2)
{
command.Parameters.Clear();
command.Parameters.Add(new SqlParameter("@codepersonally", codepersonally));
command.Parameters.Add(new SqlParameter("@namepersonal", namepersonal));

command.ExecuteNonQuery();
} command.Connection.Close();
}
finally { }
}

}

FastCode
چهارشنبه 01 آبان 1392, 10:44 صبح
SqlCommand command = null;
SqlDataAdapter adapter = null;
try
{
adapter = new SqlDataAdapter();
command = new SqlCommand(s);
command.Connection = con;
command.Connection.Open();
command.CommandType = CommandType.StoredProcedure;
adapter.SelectCommand = command;
for (int i = 0; i < 3; i += 2)
{
command.Parameters.Clear();
command.Parameters.Add(new SqlParameter("@codepersonally", codepersonally));
command.Parameters.Add(new SqlParameter("@namepersonal", namepersonal));

command.ExecuteNonQuery();
} command.Connection.Close();
}
finally
{
if(command != null) command.Dispose();
if(adapter != null) adapter.Dispose();
}