PDA

View Full Version : سوال: خطا از متد dispose موقع بسته شدن برنامه



HackerKing
شنبه 17 اسفند 1398, 00:02 صبح
سلام من امروز تازه یاد گرفتم از برنامه نویسی چند خطی استفاده کنم ولی در اولین استفاده به این مشکل بر خوردم :

همه چیز سالم بود و استفاده میشد اما موقعی که برنامه میخواد بسته شه توی کد پایین به مشکل می خوره


protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}


در قسمت base.Dispose(disposing)خطا میده

مشکل چیه ؟؟

md3848
شنبه 17 اسفند 1398, 00:05 صبح
پروژتو زیپ کن بفرست - مشکلشو اگه تونستم حل میکنم برات / اگه نتونستم بقیه دوستان...

HackerKing
شنبه 17 اسفند 1398, 00:19 صبح
پروژتو زیپ کن بفرست - مشکلشو اگه تونستم حل میکنم برات / اگه نتونستم بقیه دوستان...

پروژه خیلی سنگینه

the king
شنبه 17 اسفند 1398, 01:45 صبح
سلام من امروز تازه یاد گرفتم از برنامه نویسی چند خطی استفاده کنم ولی در اولین استفاده به این مشکل بر خوردم :

همه چیز سالم بود و استفاده میشد اما موقعی که برنامه میخواد بسته شه توی کد پایین به مشکل می خوره


protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}


در قسمت base.Dispose(disposing)خطا میده

مشکل چیه ؟؟

منظورتون از چند خطی چند نخی یا مورد دیگری مثل اجرای موازی است؟
قبل از اینکه فرم برنامه تون بسته بشه هر نخ یا خط یا هر چیز دیگری که اسمش رو بذارید فقط باید در صورتی اجازه برای ادامه اجرا داشته باشه که کاری با اون فرم و اجزای روی فرم نداشته باشه.
وقتی فرم رو می بندید، در Dispose فرم اول تمامی کمپوننت های روی فرم Dispose و حذف می شن و بعد در base.Dispose خود فرم از سرویس دهنده (ServiceProvider) حذف می شه و رخداد Disposed فرم بوجود میاد. مشکل اینطوری بوجود میاد که فرم بسته میشه و اشیاء Dispose و حذف میشن، اما همچنان یک نخ در حال اجرا همچنان میخواد به شیء ای که فرم Dispose و نابودش کرده دسترسی داشته باشه.
از رخداد FormClosing فرم استفاده کنید تا پیش از بسته شدن فرم هر چیزی که لازمه اجراش متوقف بشه متوقف کنید. مادامی که متوقف اش نکردید در همون رخداد FormClosing بمونید.

HackerKing
شنبه 17 اسفند 1398, 11:17 صبح
منظورتون از چند خطی چند نخی یا مورد دیگری مثل اجرای موازی است؟
قبل از اینکه فرم برنامه تون بسته بشه هر نخ یا خط یا هر چیز دیگری که اسمش رو بذارید فقط باید در صورتی اجازه برای ادامه اجرا داشته باشه که کاری با اون فرم و اجزای روی فرم نداشته باشه.
وقتی فرم رو می بندید، در Dispose فرم اول تمامی کمپوننت های روی فرم Dispose و حذف می شن و بعد در base.Dispose خود فرم از سرویس دهنده (ServiceProvider) حذف می شه و رخداد Disposed فرم بوجود میاد. مشکل اینطوری بوجود میاد که فرم بسته میشه و اشیاء Dispose و حذف میشن، اما همچنان یک نخ در حال اجرا همچنان میخواد به شیء ای که فرم Dispose و نابودش کرده دسترسی داشته باشه.
از رخداد FormClosing فرم استفاده کنید تا پیش از بسته شدن فرم هر چیزی که لازمه اجراش متوقف بشه متوقف کنید. مادامی که متوقف اش نکردید در همون رخداد FormClosing بمونید.

بله منظورم چند نخی بود

ممنون از کمکت دوست عزیز :چشمک:

فقط ، متد پایان یک نخ در کلاس Thread چی هستش که من استفاده کنم ؟؟:متفکر:

بازم ممنون برای کمکت:چشمک:

the king
شنبه 17 اسفند 1398, 12:15 عصر
بله منظورم چند نخی بود

ممنون از کمکت دوست عزیز :چشمک:

فقط ، متد پایان یک نخ در کلاس Thread چی هستش که من استفاده کنم ؟؟:متفکر:

بازم ممنون برای کمکت:چشمک:

می توانید برای توقف نخ از Abort استفاده کنید. Abort یک درخواست ئه و الزاما بلافاصله بعد از اجرای Abort نخ متوقف نمیشه.
برای همین پشت سرش از Join استفاده کردم تا مادامی که نخ هنوز در حال اجراست همونجا که Join نوشته شده منتظر بمونیم.
خطای ThreadAbortException رو برای این catch می کنیم که وقتی نخ توسط Abort متوقف میشه، این خطا در همون نخ بوجود میاد و کدی که در بخش catch اش بصورت اختیاری می نویسیم رو میتونه اجرا کنه.
:

private Thread _thread;

private void button1_Click(object sender, EventArgs e)
{
_thread = new Thread(YourThreadProc);
_thread.Start();
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (_thread?.IsAlive ?? false)
{
_thread?.Abort();
_thread.Join();
}
}

private void YourThreadProc()
{
try
{
while (true)
{
}
}
catch (ThreadAbortException)
{
}
}

HackerKing
شنبه 17 اسفند 1398, 12:46 عصر
می توانید برای توقف نخ از Abort استفاده کنید. Abort یک درخواست ئه و الزاما بلافاصله بعد از اجرای Abort نخ متوقف نمیشه.
برای همین پشت سرش از Join استفاده کردم تا مادامی که نخ هنوز در حال اجراست همونجا که Join نوشته شده منتظر بمونیم.
خطای ThreadAbortException رو برای این catch می کنیم که وقتی نخ توسط Abort متوقف میشه، این خطا در همون نخ بوجود میاد و کدی که در بخش catch اش بصورت اختیاری می نویسیم رو میتونه اجرا کنه.
:

private Thread _thread;

private void button1_Click(object sender, EventArgs e)
{
_thread = new Thread(YourThreadProc);
_thread.Start();
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (_thread?.IsAlive ?? false)
{
_thread?.Abort();
_thread.Join();
}
}

private void YourThreadProc()
{
try
{
while (true)
{
}
}
catch (ThreadAbortException)
{
}
}


ممنون مشکلم حل شد مرسی از کمکت

HackerKing
شنبه 17 اسفند 1398, 12:50 عصر
می توانید برای توقف نخ از Abort استفاده کنید. Abort یک درخواست ئه و الزاما بلافاصله بعد از اجرای Abort نخ متوقف نمیشه.
برای همین پشت سرش از Join استفاده کردم تا مادامی که نخ هنوز در حال اجراست همونجا که Join نوشته شده منتظر بمونیم.
خطای ThreadAbortException رو برای این catch می کنیم که وقتی نخ توسط Abort متوقف میشه، این خطا در همون نخ بوجود میاد و کدی که در بخش catch اش بصورت اختیاری می نویسیم رو میتونه اجرا کنه.
:

private Thread _thread;

private void button1_Click(object sender, EventArgs e)
{
_thread = new Thread(YourThreadProc);
_thread.Start();
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (_thread?.IsAlive ?? false)
{
_thread?.Abort();
_thread.Join();
}
}

private void YourThreadProc()
{
try
{
while (true)
{
}
}
catch (ThreadAbortException)
{
}
}


فقط چرا از کلاس ThreadStarted استفاده نکردی؟

چه تفاوتی داره اگر استفاده بشه و نشه ؟

the king
شنبه 17 اسفند 1398, 13:16 عصر
فقط چرا از کلاس ThreadStarted استفاده نکردی؟

چه تفاوتی داره اگر استفاده بشه و نشه ؟

در عمل هیچ فرقی نداره، صرفا کامپایلر از روی ظاهر YourThreadProc که نه پارامتر ورودی داره و void هم هست میتونه تشخیص بده که با ThreadStart مطابقت داره و نیازی نیست اون delegate اش رو که ThreadStart هست صریحا مشخص کنیم.
این از اون جاهایی است که کد ها رو میشه خلاصه تر نوشت، هر چقدر هم نسخه #C بالاتر رفته (ویژوال استدیوی نسخه بالاتری نصب کردید) مواردی که میشه خلاصه تر نوشت بیشتر شده.

HackerKing
شنبه 17 اسفند 1398, 13:31 عصر
در عمل هیچ فرقی نداره، صرفا کامپایلر از روی ظاهر YourThreadProc که نه پارامتر ورودی داره و void هم هست میتونه تشخیص بده که با ThreadStart مطابقت داره و نیازی نیست اون delegate اش رو که ThreadStart هست صریحا مشخص کنیم.
این از اون جاهایی است که کد ها رو میشه خلاصه تر نوشت، هر چقدر هم نسخه #C بالاتر رفته (ویژوال استدیوی نسخه بالاتری نصب کردید) مواردی که میشه خلاصه تر نوشت بیشتر شده.


باز هم ممنونم واقعا کمک زیادی کردید