PDA

View Full Version : استفاده از thread در observablecollection



aghayex
شنبه 03 فروردین 1392, 20:25 عصر
با سلام
دوستان من در یه برنامه از معماری سه لایه استفاده می کنم و برای پر کردن کمبوباکسهام از observablecollection استفاده می کنم چون موقع لود فرم من 10 کمبوباکس دارم لود شدن فرمم کند هست برا همین می خوام برا پر کردن observablecollection از ترد استفاده کنم حالا اگه دوستانی که کار کردن کمک کنن ممنون میشم

RED-C0DE
یک شنبه 04 فروردین 1392, 00:18 صبح
کجاش مشکل دارین؟ چ مشکلی دارین دقیقا؟

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

aghayex
یک شنبه 04 فروردین 1392, 00:34 صبح
namespace w
{
class viewmodef1:windowsbase
{
public observablecollection<combo>c1
{
get
{
var t=from o in db.t1 select o
return new observablecollection<combo>(t.tolist());
}
}
public viewmodef1()
{
}
}
}

من ده تا از این observablecollection ها رو دارم و تعداد 4 تا از اینها هر کدوم حدود 1000 item داره و مابقی در حد 20 تایی حالا وقتی قراره فرم بالا بیاد با تاخیر 8 ثانیه ای بالا میاد و این قابل قبول نیست.

tooraj_azizi_1035
یک شنبه 04 فروردین 1392, 13:23 عصر
سلام
نمی دونم شما چرا داری از ObservableCollection استفاده می کنی اما در مورد کندی بالا آمدن فرم می تونید با استفاده از کامپوننت BackgroundWorker عمل لود رو در پس زمینه انجام بدید. شما نباید آیتم ها رو یکی یکی به ComboBox اضافه کنید چون همین کار تاخیر رو زیاد می کنه بلکه باید در یک جدول آیتم ها رو ریخته و DataSource کمبو رو برابر این جدول قرار بدید.

aghayex
یک شنبه 04 فروردین 1392, 14:45 عصر
تشکر
در مورد اینکه چرا از observablecollection یا readonlycollection استفاده می کنم . چون من دارم از الگوی MVVM ( معماری سه لایه ) استفاده می کنم و برای بایند کمبوباکس باید از این دو شی استفاده کرد . اما اگه شما راه حل بهتری سراغ دارید بگید ممنون میشم.
در خصوص اینکه تک تک اشیا رو نباید اضافه کرد من هم با شما موافقم اما اینکارو من انجام ندادم.

RED-C0DE
یک شنبه 04 فروردین 1392, 15:15 عصر
الگو ک سر جاش هست و کارشو می کنه
شما روی فرم فقط همین کمبوباکس ها رو دارید؟
بررسی کردید ک آیا وجود این 10 تا و لود اطلاعات در این 10 تا در مجموع باعث کندی شده یا شاید ممکنه روی 2 3 مورد خاص (بخاطر کوئری ای ک سمت بانک اجرا می شه) کند باشه؟
کوئری ها یک کوئری ساده هستن یا نه؟

aghayex
یک شنبه 04 فروردین 1392, 16:17 عصر
دوست عزیز از مجموع 7 ثانیه 5.5 ثانیه ازش مربوط به اتصال به بانک هست و ما بقیش مربوط به واکشی داده چون اومدم 9 observablecollection رو غیر فعال کردم و فقط یکی رو گذاشتم اما باز هم 5.5 ثانیه رو طول کشید .اینم یه سواله :متفکر: که همیشه باهاش مشکل داشم برا اینکه برا اولین بار به یه دیتابیس وصل میشی یک زمانی رو می بره اما دوباره بهش وصل می شه اون تاخیر رو نداری

RED-C0DE
یک شنبه 04 فروردین 1392, 17:28 عصر
از EF استفاده می کنید؟

FastCode
یک شنبه 04 فروردین 1392, 18:05 عصر
ممکنه یک مقدار کد بیشتر بزارید؟ و اصل کد و بزارید؟

aghayex
یک شنبه 04 فروردین 1392, 20:34 عصر
آره از ef5 استفاده می کنم و این یه مشکل اساسی در ef هست که دوستانی که کار کردن می دونن .
مثل اینکه بحث داره منحرف میشه , من می خوام از thread برای لود اطلاعات استفاده کنم .:عصبانی++:

RED-C0DE
یک شنبه 04 فروردین 1392, 22:32 عصر
نه بحث منحرف نمی شه
برای همین من پرسیدم
وقتی از EF استفاده می کنی یک مسئله لود اولیه است ک هزینه بر است
در مورد pre-generate views در EF تحقیق کنید تا بتونید کندی لود اولیه رو مرتفع کنید:
http://www.dotnettips.info/post/1040/%D8%A8%D8%A7%D9%84%D8%A7-%D8%A8%D8%B1%D8%AF%D9%86-%D8%B3%D8%B1%D8%B9%D8%AA-%D8%A8%D8%A7%D8%B1%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C-%D8%A7%D9%88%D9%84%DB%8C%D9%87-ef-code-first-%D8%A8%D8%A7-%D8%AA%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D8%AF%D9%84%E2%80%8C%D9%87%D8%A7%DB%8C-%D8%B2%DB%8C%D8%A7%D8%AF
http://www.dotnetspark.com/kb/3706-optimizing-performance.aspx


اگه مطالب بیشتری بخواین در این زمینه ، با keyword های زیر جستجو کنید:
EntityFramework slow first query
EntityFramework PreGenerated Views

FastCode
دوشنبه 05 فروردین 1392, 01:23 صبح
من حدث میزنم که مشکل رو میدونم.
خودتون هم اگر trace کنید متوجه میشید ولی تا کد نزارید من نمیتونم چیزی بگم.

aghayex
دوشنبه 05 فروردین 1392, 02:44 صبح
وقتی از EF استفاده می کنی یک مسئله لود اولیه است ک هزینه بر است
در مورد pre-generate views در EF تحقیق کنید تا بتونید کندی لود اولیه رو مرتفع کنید:


ممنون اینو قبلا تست کردم ولی چون این مطلب برا کد فیرست هست برا من صدق نمی کرد و در پایین همین مطلب یه لینک کامپوننت گذاشته بودن که طبق مطلب زیر انجام دادم


بله. همین روال رو می‌تونید توسط افزونه «Entity Framework Power Tools (http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d)» هم انجام بدید (گزینه Generate Views را به منوی کلیک راست بر روی Entity Data Model/*.EDMX اضافه می‌کند).
و یه کلاس در کنار مدل ایجاد شد و هیچ تاثیری برا من نداشت . حالا یا کلا برای من نبود که از EF5 استفاده می کنم و یا اینکه باید کار دیگه ای هم انجام بدم و ندادم آخه صرف تولید یه کلاس چطوری سرعت اتصال رو بالا می بره در صورتی که من اصلا با اون کلاس در برنامه نویسیم کاری انجام نمی دم

FastCode
دوشنبه 05 فروردین 1392, 13:00 عصر
من نامرئی هستم؟

aghayex
دوشنبه 05 فروردین 1392, 13:11 عصر
نه خواهش می کنم و تشکر از اینکه منو در این مشکل همراهی می کنی .
تا اینجا نتیجه بحث دو چیز شد :
1 ) کم بودن سرعت اولیه تکنولوژی EF به خصوص EF5 که دوستمون دو رفرنس گفت که در وب سایت آقای نصیری به این موضوع اشاره کرده و یک راهکار داده ولی در پایین همون موضوع یکی اعلام کرده که من این کار رو انجام دادم و یک کلاس کنار مدل ایجاد شده حالا چطور باید ازش استفاده کنم که جواب داده بودن ...
که همچنان مشکل پا برجاست
من برا این مشکل دو راهکار تو ذهنم هست :
الف ) استفاده از اسپلش و خواندن سوری بانک در هنگام بالا آمدن برنامه تا به نحوی این کند بودن EF5 مخفی بشه
ب ) استفاده از ترد
2 ) استفاده از تردها برا مواقعی که قراره اون ترد یک مقدار برگردونه؟ چون با تردی که قرار نیست به اشیا ترد اصلی دسترسی داشته باشه مشکلی ندارم و مشکل من با تردهایی هست که قراره به اشیا ترد اصلی دسترسی داشته باشه

FastCode
دوشنبه 05 فروردین 1392, 13:51 عصر
میخواستم قبل از اینکه بگم مشکلتون چیه مطمئن بشم.
لطفا کد مربوط به SelectedIndexChanged همه combo ها را بزارید.

در ۲.۵ ثانیه من ۱۲۰ تا table نسبتا بزرگ رو load میکنم, همه constraint ها رو چک میکنم و تمام relation ها رو map میکنم و بعدش به کاربر گزارش میدم.
کد شما ایراد داره.مشکل از ترد نیست.

aghayex
دوشنبه 05 فروردین 1392, 14:56 عصر
ممنون
ولی نمی دونم شما تا حالا با مدل mvvm کار کردید ( البته اینو بگم که من با wpf سی شارپ کار می کنم ) یا نه در این مدل اطلاعات یه کمبو باکس رو در یه observablecollection می ریزیم و این شی رو به ithemsource کمبوباکس بایند می کنیم و خصوصیت selectedvalue رو به خصوصیت موجودیتمون بایند می کنیم و اصلا با SelectedIndexChanged کار نمی کنیم
همون طور که گفتم از مجموع 7 ثانیه 5.5 اون مربوط به لود اولیه تکنولوژی entity هست چرا چون همه observablecollection رو بیر از یکی آف کردم اما باز هم زمان 6 ثانیه رو طول کشید .
حرف شما به نحوی درست هست بله لود داده ها 2تا3 ثانیه طول نمی کشه اما مشکل لود اولیه هست .

FastCode
دوشنبه 05 فروردین 1392, 15:03 عصر
بعد از ۱۶ تا پست میگید با wpf کار میکنید؟
چرا از کد گزاشتن میترسید؟قول میدم کسی نخوردش.

aghayex
دوشنبه 05 فروردین 1392, 16:54 عصر
نه بخدا اینطور نیست چون دیتابیس حالت خصوصی داره و برنامه هم با vs 2012 و کامپوننت mvvm هست نمی شه یه نمونه کد درست و حسابی ازش درآورد

RED-C0DE
دوشنبه 05 فروردین 1392, 17:30 عصر
از استفاده ی observablecollection و سینتکس نمونه ای ک گذاشتین می شد حدس زد WPF رو ولی فرقی نمی کنه
شما در مورد همون keyword هایی ک گفتم تحقیق کنید تا ب جواب درست برسین .
ارتباط اولیه و ساخت مدل در ارتباط اول در EF.
یا
همونطور هم ک خودتون گفتین می تونین مثلا در splash یک درخواست (حتی بصورت صوری/سوری) بفرستین و پشت زمینه این قضیه رو حل کنین. بعد از اون دیگه این مشکل رو ندارین (در واقع بعد از اون دیگه پارامترهای دیگه ای مطرح می شن برای کارایی)

ی نکته هم چون با EF کار می کنین ، اگه هنوز یکسری جاها احساس می کنید ک از پشت صحنه خبر ندارین (چون بهتره خبر داشته باشین!) و نمی دونین کی و ب چ صورت داره کوئری ها ارسال/دریافت می شن ب/از بانک و اگر ک علاقه دارین کم کم تو این زمینه مسلط بشین تا مشکلات مربوط ب کارایی و بهبود عملکرد برنامه هاتون رو بهتر بتونین هندل کنید خودتون، حتما از ابزارهای Profiler کمک بگیرید (یا خود SQL Server Profiler یا ی چیزی مثل http://www.hibernatingrhinos.com/products/efprof )
ب این صورت ممکنه جایی ک انتظار داشتین قبلا با اجرای دستور شما فقط 1 یا 2 درخواست سمت بانک می فرستین، اما در واقعیت ببینید ک حدود 10 درخواست داره فرستاده می شه و ممکنه خیلیاش تکراری و شاید قابل بهینه سازی باشه یا متوجه ی مشکل منطقی تو روال کارتون بشین ...

ی ابزار خوب و کارراه انداز هم از RedGate تو این زمینه ها هست مخصوص Profile کردن Performance و Memory و کوئری های SQL
http://www.c-sharpcorner.com/UploadFile/mgold/ants-profiler-by-red-gate-gives-a-command-performance/Images/ANTS8.gif

http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/

FastCode
دوشنبه 05 فروردین 1392, 18:17 عصر
نه بخدا اینطور نیست چون دیتابیس حالت خصوصی داره و برنامه هم با vs 2012 و کامپوننت mvvm هست نمی شه یه نمونه کد درست و حسابی ازش درآورد
فکر نمیکنم به جز من و ۷ ۸ نفر دیگر کسی اینجا OpenSource کار کنه.همه برنامه ها خصوصی هست.
شما فقط چک کن که قبل از آماده شدن همه کمبو ها درخواستی به sql فرستاده نشه.

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

aghayex
سه شنبه 06 فروردین 1392, 13:07 عصر
با تشکر از دوست عزیز RED-CODE که منو همراهی کردن درخصوص ترد ها حالا به هر نحوی بود دوستان کمک آن چنانی نکردن و در خصوص کند بود سرعت اتصال اولیه ef به بانک هم طرحی رو ندادن شاید اصلا راهی نبود .
اما مشکلو فعلا به این صورت حل کردم کد هایی که وظیفه پر کردن کمبوباکس رو دارن رو در رویداد بعد از لود ویندوز یعنی contentrendered قرار دادم به این ترتیب فرم راحت نمایش داده می شه و بعد کد ها اجرا می شن