PDA

نسخه کامل مشاهده نسخه کامل : لود اطلاعات SQL با استفاده از BackgroundWorker



shadmehrshadow1
02-11-2013, 11:41
سلام
من از کد زیر در جست و جو هام استفاده می کنم .

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

میخوام وقتی که روی دکمه ی جست و جو وارد می کنم و این اطلاعات رو لود داره می کنه توی دیتا گرید یه فرم باز بشه شامل یه اسکرول بار و میزان لود شدن اطلاعات رو نشون بده و یه دکمه کنسل هم براش بزارم که وقتی کلیک شد از ادامه لود اطلاعات جلوگیری کنه.
البته دوستان روش BackgroundWorker رو پیشنهاد دادند . منم دنبالش روش و در این مورد چیز هایی رو هم پیدا کردم. اما نحوه جست و جوی اون ها به یک شکل دیگر بود و با کد جست و جوی من همخوانی نداشت و باید برای اینکه از اون روش استفاده کنم کل فانکشن هام رو تغییر بدم و به طور طبع کد هایی که از این تابع ها استفاده می کنه.
میخوام ببینم میشه توی این کد من هم همچین کاری کرد. ممنون میشم اگه کمک بفرمایید. :n16:

shadmehrshadow1
08-11-2013, 12:00
یعنی راهی نیست که بشه با این روش انجامش داد؟

_H2_
08-11-2013, 18:55
سلام
میتوانید عملیات بارگذاری را در ریسمان مجزایی انجام دهید و در این بین هم یک تصویر gif یا پیامی برای انتظار نشان دهید ولی نشان دادن نوار پیشرفت (بیان درصد) کد زیادی میخواهد چون اغلب ORM های موجود این درصد را بیان نمیکنند و آن را پشتیبانی نمیکنند که البته تا حدودی هم حق دارند!

کد نمونه:

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

shadmehrshadow1
08-11-2013, 23:26
بله ممنون.

نظرتون راجع به این کد چیه :


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

نمیشه مثلا تعداد نتایج جست و جویی که به دست میاد رو با استفاده از دستور Count در اس کیو ال به دست آورد و سپس با یه دست اومدن هر سطر از جست و جو یک مقدار از 0 شروع کنه و تا رسیدن به مقدار count یکی یکی اضافه بشه و یا همچین چیزی؟
اصلا این روش ، روش حرفه ای و مناسبی هست؟!
ممنون از وقتی که میذارید.

_H2_
08-11-2013, 23:55
سلام مجدد
ارائه نوار پیشرفت برای این منظور کلاً منطقی نیست:
1) ORM ها درصد خواندن اطلاعات را پشتیبانی نمیکنند.

2) اگر خودتان هم بخواهید اطلاعات را بخوانید مجبور میشوید یکبار Count بگیرید و یکبار هم بخوانید.
دستور Count برخلاف ظاهر ساده اش دستور پرهزینه است و نیاز است موتور دیتابیس یکبار کل پرس و جو را اجرا و نتایج را شمارش کند،
در واقع شما مجبور میشوید دوبار از دیتابیس استعلام بگیرید و در نهایت هم بجای ORM های موجود خودتان باید اطلاعات را بخوانید تا بدانید چند سطر را خوانده اید!!!

3) اصولاً بارگذاری اطلاعات شما از دیتابیس نباید آنقدر زمان بر باشد که نوار پیشرفت بخواهید.
حتی اگر عملیات تان چند ثانیه هم بطول بکشد باز نیازی به نوار پیشرفت نیست.
اگر هم حجم اطلاعات واکشی شده بسیار زیاد است (مثلاً چند ده هزار سطر) منطق آن است که یک مکانیزم صفحه بندی مناسب در برنامه تان پیاده سازی کنید تا بعنوان نمونه هربار فقط 100 سطر واکشی شود.

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

shadmehrshadow1
09-11-2013, 14:16
ممنون از راهنماییتون.
نمیشه همه ی این کد ها روی توی یه Sub نوشت ؟ آخه اینجوری که 3 تا شد . باعث میشه من مجبور بشم کل کدهام رو تغییر بدم و کلا به هم میریزه :n27:

و اینکه میشه یک این تصویر یا پیغام لطفا صبر کنید را در یک فرم دیگه قرار داد و در اون فرم یک دکمه انصراف قرار داد تا با کلیک روی اون عملیات متوقف بشه؟

_H2_
09-11-2013, 21:33
سلام
اول در مورد پست سوم خودم باید عرض کنم که اشتباهاً در محل فراخوانی تابع EndLoadData مجدد AsyncLoadData درج شده بود که تصحیح کردم.



نمیشه همه ی این کد ها روی توی یه Sub نوشت ؟ آخه اینجوری که 3 تا شد . باعث میشه من مجبور بشم کل کدهام رو تغییر بدم و کلا به هم میریزه

باید فقط دو تابع دیگر اضافه کنید، چرا باید کل کدها را تغییر دهید؟
اگر راضی تان میکند، اینطوری هم میشود و یک تابع هم خواهد بود! :n13:

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



و اینکه میشه یک این تصویر یا پیغام لطفا صبر کنید را در یک فرم دیگه قرار داد

بله به سادگی




در اون فرم یک دکمه انصراف قرار داد تا با کلیک روی اون عملیات متوقف بشه؟

چون حلقه پر کننده دیتاست داخل ORM است و به آن دسترسی نداریم، اگر بخواهیم عملیات را متوقف کنیم باید قبل عملیات اشاره گر ریسمان را ذخیره و درصورت لزوم آن را ناچار به Abort ریسمان خواهیم بود.
یک چیز تو مایه های مشابه EndTask یک برنامه در ویندوز!
من کدش را برایتان میگذارم (نگویید هرچه میخواهم، راه نمایی نمیکنند و آیه یاس میخوانند! :n02:)، ولی باور بفرمائید یک عملیات چند ثانیه ای ارزش این Abort را ندارد (حتی ارزش آن فرمی که بازشود را هم ندارد!)، احتمالاً در اکثر مواقع قبل از انکه کاربرتان متوجه شود و تصمیم بگیرید که میخواهد یا نمیخواهد عملیات را لغو/متوقف کند، عملیات تمام شده و رفته!!!

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

shadmehrshadow1
10-11-2013, 11:34
اول از همه ممنون برای وقتی که میذارید.
در مورد به هم ریختن کد با این کد جدیدی که دادید میتونم حلش کنم .ممنون

بله در مورد اینکه اطلاعات سریع لود میشه من هم با شما موافقم . در واقع فکر کنم مشکل اصلی که برای من به وجود میاد به خاطر اینه که من اطلاعات رو قصد دارم از اینترنت و یک سرور روی نت بخونم به همین دلیل گفتم شاید در خوندن اطلاعات به دلیل سرعت اینترنت کمی زمان بر باشه .
مورد دیگه ای که ممکنه پیش بیاد اینه که وقتی میخواد به سرور متصل بشه تنظیمات کانکشن استرینگ روی 30 ثانیه هست و در صورتی که به هردلیلی مثلا قطع بودن یا کند بودن سرعت اینترنت نتونه اطلاعات رو دریافت کنه در این صورت وقتی روی دکمه ی جست و جو کلیک کنه در این 30 ثانیه به نوعی برنامه گیر میکنه و دیگه نمیشه کاری انجام داد تا اون 30 ثانیه بگذره و بگه که ارتباط برقرار نشد . در این مورد راه کار چیه ؟!!

ببخشید یک سوال دیگه هم داشتم ولی نمیدونستم عنوانش رو چی بذارم . در همینجا مطرح میکنم با اجازتون .


من در فرمم حدود 15 تا چک باکس قرار دادم برای جست و جو که بشه عملیات جست و جو رو بر اساس فیلد های مختلف انجام بشه .
مثلا تعیین کنه که جست و جو بر اساس نام،نام خانوادگی،تلفن،کد ملی و . . .
ولی نمیدونم چه طور باید این کد هایی که دارم رو قرار بدم . درواقع مشکل من اینجاست که چه طور بفهمم کدام یک از چک باکس ها فعال هست و بعد بر اساس اون ها کد جست و جو رو قرار بدم.
برای مثال ممکنه هر 15 تا چک باکس فعال باشه و یا چک باکس های 1،5،7،9،12 فعال باشه .
پیشنهاد شما استفاده از چه دستوری است. من خواستم از دستور IF استفاده کنم که دیدم خیلی تو در تو و پیچیده میشه .
حالا اگه همه چک باکس ها فعال باشند زیاد مشکلی نیست اما اینکه کد رو برای حالت های مختلف تعداد چک باکس های فعال تنظیم کنیم سخته . ممکنه 2 چک باکس فعال باشه ( این دو چک باکس هم میتونه تعداد زیادی حالت داشته باشه. مثلا چک باکس 1 و 2 یا چک باکس 2 و 4 و یا چک بامس 10 و 5 )
امیدوارم منظورمو درست رسونده باشم.
در واقع مشکل اصلی فکر کنم انتخاب اینه که از چه ساختاری استفاده کنیم. مثلا IF , Select case , For و . . . .

_H2_
12-11-2013, 23:13
سلام

در این مورد راه کار چیه ؟!!
دو زمان timeout یکی برای ارتباط و یکی برای اجرا قابل تنظیم است.
timeout ارتباط از طریق connectionstring انجام میشود:

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

و timeout اجرا را هم میتوانید مستقیم تغییر دهید:

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


از چه ساختاری استفاده کنیم
ساختارهایی با پایه تفکری مانند این گمانم مشکلتان را حل کند:
البته میتوانید الگو را گرفته و تغییرات بسیاری بدهید

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

shadmehrshadow1
15-11-2013, 13:33
ممنون .

در مورد :


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

این 60 یعنی چی؟! یعنی 60 ثانیه منتظر می ماند که دستور اس کیو ال که برای جست و جو داده ایم اجرا شود . و در صورتی که از این 60 ثانیه بگذرد دستور لغو می شود؟ و یا یک همچین چیزی و یا حتی 60 ثانیه منتظر می ماند که ارتباط به دیتابیس برقرار شود؟!
در صورتی که این چنین باشد تغییری در اصل مسئله نمی کند و باز هم یک 60 ثانیه زمان انتظار به وجود آمده که کاربر باید صبر کند.
شاید من متوجه این قطعه کد و منظورتون نشدم. :n13:

اما در مورد کد شرطی . ممنون از راهنماییتون. :n16:

shadmehrshadow1
15-11-2013, 16:21
ببخشید من همینجور مسئله و سوال واسم پیش میاد.
یه مورد دیگه هم که راجب threading هست اینه که . من یه فرم اصلی دارم که اول از همه اون فرم به اجرا در میاد و یک سری اطلاعات محاسباتی رو در یافت میکنه که این کنه ربطی به اس کیو ال و دیتا ست نداره و این کد ها هم مرتبط به هم هستند . یعنی باید یکی پس از دیگری اجرا بشند . به عبارتی اجرای هر یک از اون ها به اجرای قبلیش بستگی داره. این مورد هم یکمی زمان بر هست واسه همین می خوام واسش فقط فرم که پیغام لطفا صبر کنید داره براش بزارم . ولی میاد زیاد کار با threading رو بلد نیستم و وقتی ازش استفاده میکنم همه ی کد ها با هم اجرا میشوند و به مشکل بر میخورم. البته بدون threading هم استفاده میتونم بکنم ولی اون فرمی که میخوام براش پیغام توش بزارم یه جورایی هنگ میکنه. برای مثال اگه یه تصویر لودینگ متحرک براش بزارم یا حرکت نمیکنه یا خیلی دیر.
ممنون میشم توی این مورد هم راهنمایی بفرمایید.

یک مورد دیگه هم برام پیش میاد که وقتی توی برخی از کدهام که از دستور جوین استفاده میکنم و یک سری اطلاعات رو بر اساس جدول های دیگه به دست میارم . وقتی نتیجه به بدست میاد سطر های تکراری رو توی دیتاگرید میبینیم . مثلا فرض کنید آدرس رو از توی جدول دیگه جوین میگیرم . و آدرس تهران رو جستو جو میکنم و نتایج باید رکورد هایی با کد 2و3و4و8و10 به دست بیاد . توی دیتا گرید این سطر ها چندبار پشت سر هم نمایش داده میشه .

تقریبا به این شکل:


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

_H2_
18-11-2013, 23:06
سلام
گفتید برخی فرم هایتان باید پشت سرهم و به ترتیب اجرا شوند و یکی وابسته به اتمام خروجی دیگری است...
در این موارد چند ریسمانی فایده خاصی ندارد، چون مزیت چند ریسمانی در فرآیندهایی است که میتوانند همزمان و موازی در کنار هم اجرا شوند.

در مورد تصویر gif هم که گفتید حرکت نمیکند، برای عدم استفاده از چند ریسمانی طبیعی است!
چون وقتی برنامه شما یک ریسمان دارد (همان ریسمان اصلی) همین ریسمان است که مسئول اجرای کدهای زمان بر شما و مسئول بروزرسانی تصویر gif است، در نتیجه وقتی برنامه تان در حلقه ای طولانی گیر کند، تصاویر gif شما هم مانند سایر عناصر واسط کاربری فریز میشوند.

در خصوص نمایش دیالوگ در حین کار، میتوانید از کدی مانند کد زیر، استفاده کنید.
ضمن اینکه اگر از کدهای پست قبل هم استفاده کنید در نمایش صحیح فایل های gif مشکلی نخواهید داشت.

در واقع در کد زیر و کدهای قبل سه تابع وجود دارد.
اولی محلی برای کدنویسی عملیات های پیش از آغاز ریسمان جدید است.
بعدی کد زمان بری که باید در حین عملیات ریسمان جدید اجرا شود.
و تابع سوم عملیاتی که باید پس از پایان ریسمان انجام شود.

در مورد دیالوگ، کافی است بازکردن و بستن آن به ترتیب در تابع اول و سوم تعبیه شوند.

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

_H2_
18-11-2013, 23:33
سلام مجدد
سوال قبلی تان را فراموش کردم


این 60 یعنی چی؟! یعنی 60 ثانیه منتظر می ماند که دستور اس کیو ال که برای جست و جو داده ایم اجرا شود . و در صورتی که از این 60 ثانیه بگذرد دستور لغو می شود؟ و یا یک همچین چیزی و یا حتی 60 ثانیه منتظر می ماند که ارتباط به دیتابیس برقرار شود؟!

همانطور که در پست نهم اشاره کردم دو timeout مجزا برای connection و command وجود دارد.
timeout رشته اتصال برای حداکثر زمان open شدن یک connection است
و
timeout ای که شما در تاپیکتان اشاره کردید، مربوط به حداکثر زمان لازم برای اجرا شدن یک SQL در دیتابیس است.
(((
اصولاً فرآیند های مرتبط با دیتابیس در بستر شبکه یا حداقل بستر ارتباط بین دو برنامه متفاوت اجرا میشود.
مانند آن است که تلفن را بردارید و شماره ای بگیرید، اگر شانس بیاورید چند لحظه منتظر میمانید و کسی گوشی را بر میدارد ولی اگر کسی آنور خط نباشد یا اگر باشد و به علت مشغله فرصت برداشتن گوشی را پیدا نکند، شما که نمیتوانید و نمیخواهید تا آخر عمرتان گوشی را دستت تان نگاه دارید و منتظر پاسخ دادن یک نفر بمانید؟؟؟!!! بحرحال یک timeout ای برای خودتان قائل هستید و اگر خیلی طول بکشد گوشی را میگذارید.

این دقیقاً مفهوم و دلیل وجودی همین timeout ها است.
)))

shadmehrshadow1
19-11-2013, 17:16
باز هم ممنون به خاطر وقتی که میذارید و راهنمایی هایی که میکنید. :n16:


در مورد تصویر gif هم که گفتید حرکت نمیکند، برای عدم استفاده از چند ریسمانی طبیعی است!

یعنی با این وضع نمیشه از تصویر Gif استفاده کرد؟؟ (من هنوز کدی رو که گذاشتید رو امتحان نکردم.)


ضمن اینکه اگر از کدهای پست قبل هم استفاده کنید در نمایش صحیح فایل های gif مشکلی نخواهید داشت.
من هرکاری کردم نتونستم کاری کنم که این تصویر Gif به درستی حرکت کند. در واقع کد های من در اون قسمت اصلا ربطی به اس کیو ال ندارند و یک سری اعمال محاسباتی را انجام می دهند.(در تبدیل اون کد از حالت اس کیو ال به حالت معمولی مشکل دارم. چون اون کد توش دیتاست و لود اطلاعات در دیتاگرید و .... داره ) :n27:


مانند آن است که تلفن را بردارید و شماره ای بگیرید، اگر شانس بیاورید چند لحظه منتظر میمانید و کسی گوشی را بر میدارد ولی اگر کسی آنور خط نباشد یا اگر باشد و به علت مشغله فرصت برداشتن گوشی را پیدا نکند، شما که نمیتوانید و نمیخواهید تا آخر عمرتان گوشی را دستت تان نگاه دارید و منتظر پاسخ دادن یک نفر بمانید؟؟؟!!! بحرحال یک timeout ای برای خودتان قائل هستید و اگر خیلی طول بکشد گوشی را میگذارید.

بله درست هستش . ولی منظور من بیشتر در این قسمت بود که در این زمان انتظار همان طور که در مثال تلفن صدای بوقی را میشنویم و میفهمیم که باید منتظر بمانیم در این رابطه هم به جای صدای بوق میشه حداقل از یک پیغام منتظر بمانید و یا یک پرئگرس بار و یا یک همچین چیزی استفاده کنیم که طرف مقابل بداند که باید صبر نماید. در مورد هر دو TimeOut منظورم هست. (میشه چنین کاری انجام داد؟ در این صورت این کار به نظرتان درست و منطقی هست؟) :n13:

در مورد اون سوال دیگر و وجود سطر های تکراری هم ممنون میشم راهنمایی فرمایید. :n01:

_H2_
22-11-2013, 18:07
سلام


یعنی با این وضع نمیشه از تصویر Gif استفاده کرد؟؟
من هرکاری کردم نتونستم کاری کنم که این تصویر Gif به درستی حرکت کند

بدون چند ریسمانی راه صحیح و تمیزی ندارد.
برنامه شما بطور پیشفرض یک ریسمان دارد، یک کارمند!
اگر این کارمند عزیز برای کار طولانی و زمان بری بفرستید و الافش کنید(!) نباید انتظار داشته باشید کس دیگری از جای دیگری بیاید و کارهای دیگر برنامه تان را انجام دهد!



حداقل از یک پیغام منتظر بمانید ... یا یک همچین چیزی استفاده کنیم که طرف مقابل بداند که باید صبر نماید ... میشه چنین کاری انجام داد؟

پس تا الآن داشتیم در خصوص چه چیزی صحبت میکردیم!!! :n02:
خوب مگر همین کارها در کدهای قبلی انجام نشده؟! :n13:

موفق باشید.

shadmehrshadow1
23-11-2013, 15:28
ممنون باز هم

در مورد پست 11 هم یه توضیحی میدید . چرا اینجور میشه؟

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

_H2_
24-11-2013, 01:24
سلام


در مورد پست 11 هم یه توضیحی میدید . چرا اینجور میشه؟

در پست 13 تلاش کردم پاسخ سوال پست 11 تان را بدهم.
حقیقتش الآن دقیقا منظورتان را از "چرا اینجور میشه" متوجه نمیشوم.
بهتر است سوالات تان را شفاف تر مطرح نمایید.
باز هم چشم!
همانطورکه قبلا در پست 13 بیان کردم عدد timeout بیان کننده حداکثر زمانی است که کدشما(کلاینت) منتظر پاسخ از سرور خواهد ماند.
اگر سرور زودتر جواب داد چه بهتر ولی اگر دیرتر از زمان مشخص شده طول کشید، کل عملیات لغو میشود.



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

بد نیست هر تاپیک به یک مشکل و مسئله مشخص بپردازد ولی از طرفی هم این رویه اینجا خیلی رعایت نشده و گمانم عرف کردن آن هم باعث زحمت و اذیت دوستان بشود ...
هر طور صلاح میدانید.