PDA

View Full Version : گفتگو: Using() – Dispose مزایا و معایب



hamid.shekasteh
چهارشنبه 18 آذر 1388, 08:11 صبح
با توجه به این حرف گفته شده به بنده که:"ممکن است با این کد بعد از ثبت حدود 50 رکورد سیستم هنگ کند به خاطر استفاده از DataTable"
و جمله زیر
"منبع نادر(Scarce):منبعی است که شما تعداد کمی از آن را در اختیار دارید.مانند اتصالات به پایگاه داده"

1- من چگونه می توانم بفهمم که آیا واقعا چنین مشکلی برای برنامه من می افتد یا خیر؟

2-آیا برای اطمینان می توان از Using() استفاده کرد و ساز و کار آن چیست؟

من کدی شبیه زیر برای هر جدول پایگاه داده نوشته ام(به ازای هر جدول پایگاه یک کلاس این چنینی نوشته ام).



public class User
{
public static string ConnectionStr = "Data Source=(LOCAL);Initial Catalog=db;Integrated Security=True";

protected SqlCommand selectCommand;
protected SqlCommand insertCommand;
protected SqlCommand updateCommand;
protected SqlCommand deleteCommand;

SqlConnection connection;
SqlDataAdapter dataAdapter;

public User()
{
connection = new SqlConnection(ConnectionStr);

selectCommand = new SqlCommand("…", connection);
insertCommand = new SqlCommand("…", connection);
updateCommand = new SqlCommand("…", connection);
deleteCommand = new SqlCommand("..", connection);

dataAdapter = new SqlDataAdapter();


dataAdapter.SelectCommand = selectCommand;
dataAdapter.InsertCommand = insertCommand;
dataAdapter.DeleteCommand = deleteCommand;
dataAdapter.UpdateCommand = updateCommand;
this.dataAdapter.TableMappings.AddRange(…);
}

public override void Save()
{
dataAdapter.Update(dt);
dt.AcceptChanges();
}

public override void Fill()
{
dataAdapter.Fill(dt);
}
{


باتشکر.

Afshin160
چهارشنبه 18 آذر 1388, 08:37 صبح
سلام ...
شما در تمام مواردي كه سازنده كلاس متد IDisposable دارد شما مي توانيد از Using استفاده كنيد . خوب از مزايا ش اينكه ديگه شما نمي خواهد نابود شدن كلاس يا بسته شدنش را كنترول كنيد Using اين اطمينان را به شما مي دهد كه اين كارو براي شما انجام ميدهد .

hamid.shekasteh
پنج شنبه 19 آذر 1388, 07:47 صبح
دوست عزیز در مورد کلاس من چگونه کدی بهتر است بنویسم
نمونه ای سراغ دارید؟

Ali_M_K
پنج شنبه 19 آذر 1388, 19:20 عصر
ببخشید من فکر میکردم using برای اشیائ بزرگ استفاده میشود نه کارکردهای سنگین..

اگه کسی میتونه در این مورد راهنمایی کنه

sia_2007
پنج شنبه 19 آذر 1388, 22:13 عصر
Using تضمین میکند که متد Dispose کلاس شما یا خود کلاسهای Net. ؛ تحت هر شرایطی اجرا شود.
برای این که کلاس شما از این ویژگی استفاده کنید؛ باید اینترفیس IDisposable رو پیاده سازی کنید.
موفق باشی

در ضمن تا آخر جمعه یه پروژه که خودم نوشته ام رو آپلود میکنم.
هم شما مسائل جدیدی یاد میگیرید؛ هم نکات مهم رو به من یاد میدید.

hamid.shekasteh
یک شنبه 22 آذر 1388, 07:56 صبح
Using تضمین میکند که متد Dispose کلاس شما یا خود کلاسهای Net. ؛ تحت هر شرایطی اجرا شود.
برای این که کلاس شما از این ویژگی استفاده کنید؛ باید اینترفیس IDisposable رو پیاده سازی کنید.
موفق باشی

در ضمن تا آخر جمعه یه پروژه که خودم نوشته ام رو آپلود میکنم.
هم شما مسائل جدیدی یاد میگیرید؛ هم نکات مهم رو به من یاد میدید.

البته من هنوز جواب سوالم رو نفهمیدم که آیا ممکنه بعد از ثبت - ویرایش یا حذف تعدادی رکورد سیستم هنگ کنه و بالا نیاد (حتی اگر این عدد خیلی زیاد باشه مثل 10000 تا رکورد در یک روز هم این موضوع جالب نیست)؟

اما خب ، با توجه به مطالب بالا من فکر می کنم که نوشتن کد برای کلاس باید چیزی شبیه زیر باشد:





public class User:IDisposable
{
bool is_disposed = false;

protected virtual void Dispose(bool disposing)
{
is_disposed = true;
}


public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}


~ User ()
{
Dispose(false);

}





در این قسمت کدهای پست اول تکرار می شود//

{


خب اگر فرض کنیم که تکه کد اضافه شده بالا درست بوده و با فراخوانی Dispose شی مورد نظر ما واقعا حافطه را آزاد می کند.

آیا این طرز استفاده صحیح است ؟ در فرمی که می خواهیم از این کلاس استفاده کنیم در موقع بسته شدن فرم یا Closing متد Dispose را فراخوانی می کنیم.

لطفا مرا در تصحیح و تکمیل کد راهنمایی بفرمایید.
با تشکر

firoozi90
دوشنبه 30 مرداد 1391, 13:06 عصر
البته من هنوز جواب سوالم رو نفهمیدم که آیا ممکنه بعد از ثبت - ویرایش یا حذف تعدادی رکورد سیستم هنگ کنه و بالا نیاد (حتی اگر این عدد خیلی زیاد باشه مثل 10000 تا رکورد در یک روز هم این موضوع جالب نیست)؟


واقعا چنین چیزی هست؟
من توی یکی از برنامه هایی که نوشتم که البته عکس توی دیتابیس رو ذخیره میکرد تا 800 تایی رکورد ثبت کردم که وقتی تعداد رکوردها زیاد شد.برای چندثانیه برنامه هنگ میشد.
که گفتم شاید بخاطر رفرش شدن دیتا گرید باشه.