PDA

View Full Version : دسترسی به اشیا فرم در یک thread یا BackgroundWorker



aghayex
یک شنبه 20 فروردین 1391, 23:26 عصر
دوستان من یه دیتا گرید دارم که برای پر کردنش از یه تابع استفاده می کنم حالا می خام این رو در یه ترد مجزا انجام بدم آیا دوستان روشی سراغ دارند که بشه با اون از طریق یه ترد یا BackgroundWorker به اشیای ترد اصلی برنامه دسترسی داشت

omid_csh
یک شنبه 20 فروردین 1391, 23:49 عصر
دوستان من یه دیتا گرید دارم که برای پر کردنش از یه تابع استفاده می کنم حالا می خام این رو در یه ترد مجزا انجام بدم آیا دوستان روشی سراغ دارند که بشه با اون از طریق یه ترد یا BackgroundWorker به اشیای ترد اصلی برنامه دسترسی داشت
سلام

CheckForIllegalCrossThreadCalls = false;

aghayex
یک شنبه 20 فروردین 1391, 23:57 عصر
ممنون از جوابت اما این کد رو در کجا بنویسم

private void Window_Loaded(object sender, RoutedEventArgs e)
{
Thread t1 = new Thread(new ThreadStart(Askh_nh));
t1.Name = "Anh";
t1.Start();

Thread t2 = new Thread(new ThreadStart(Bskh_nh));
t2.Name = "Bnh";
t2.Start();

Thread t3 = new Thread(new ThreadStart(Cskh_nh));
t3.Name = "Cnh";
t3.Start();
}
private void Askh_nh()
{
a = new SKHAEntities();
CollectionViewSource anh = ((CollectionViewSource)(this.FindResource("anh")));
ObjectQuery<systema.nh> anhQuery = a.nhs;
Action action=delegate
{
anh.Source = anhQuery.Execute(MergeOption.AppendOnly);
};
anh.Dispatcher.Invoke(DispatcherPriority.Normal, action);
//a.Dispose();
}

private void Bskh_nh()
{
b = new SKHBEntities();
CollectionViewSource bnh = ((CollectionViewSource)(this.FindResource("bnh")));
ObjectQuery<systemb.nh> bnhQuery = b.nhs;
Action action = delegate
{
bnh.Source = bnhQuery.Execute(MergeOption.AppendOnly);
};
bnh.Dispatcher.Invoke(DispatcherPriority.Normal, action);
//bskh.Dispose();
}

private void Cskh_nh()
{
c = new SKHCEntities();
CollectionViewSource cnh = ((CollectionViewSource)(this.FindResource("cnh")));
ObjectQuery<systemc.nh> cnhQuery = c.nhs;
Action action = delegate
{
cnh.Source = cnhQuery.Execute(MergeOption.AppendOnly);
};
cnh.Dispatcher.Invoke(DispatcherPriority.Normal, action);
//Cskh.Dispose();
}

private void button1_Click(object sender, RoutedEventArgs e)
{
a.SaveChanges();
b.SaveChanges();
c.SaveChanges();
}

hakim22
دوشنبه 21 فروردین 1391, 11:45 صبح
وقتی شما از BackgroundWorker استفاده میکنید هر کدی که در ProgressChanged بنویسید به صورت Thread Safe است و میتوانید خصوصیات یک کنترل دیگه رو تغییر بدید.
فقط دیگه دست شما نیست که کی اون رویداد فراخونی میشه. ویندوز کنترلش می کنه . که چیز بدی نیست البته.

اگر قصد دارید به صورت دستی تغییر رو انجام بدید و نخ طراحی کنید. باید یک Deglegate بسازید و با مدیریت Invoke اینکارو انجام بدید. یکمی کد نویسی داره ولی زیاد سخت نیست.

aghayex
دوشنبه 21 فروردین 1391, 14:48 عصر
وقتی شما از BackgroundWorker استفاده میکنید هر کدی که در ProgressChanged بنویسید به صورت Thread Safe است و میتوانید خصوصیات یک کنترل دیگه رو تغییر بدید.

مثالهایی که در مورد BackgroundWorker بود فقط اومده یه متغیر رو از تابع dowork پاس داده و در رویداد ProgressChanged به شی نصبتش می دی اما تو کدهای من یه تیبل هست


اگر قصد دارید به صورت دستی تغییر رو انجام بدید و نخ طراحی کنید. باید یک Deglegate بسازید و با مدیریت Invoke اینکارو انجام بدید. یکمی کد نویسی داره ولی زیاد سخت نیست.

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

hakim22
دوشنبه 21 فروردین 1391, 15:07 عصر
قفله یعنی Lock میکنید تا کاربر نتونه کاری بکنه !؟
باز هم بهتر از اینه که Not responding باشه
در ضمن اگر در BackgroundWorker کار کنید میتونید یک progressbar داشته باشید و با کمک اون پیشرفت کارو نشون بدید که خیلی برنامه بهتر میشه و حرفه ای تر.

لازم نیست تغیرات گرید رو رکورد به رکورد نشون بدید، برنامه خیلی کند میشه


مثالهایی که در مورد BackgroundWorker بود فقط اومده یه متغیر رو از تابع dowork پاس داده و در رویداد ProgressChanged به شی نصبتش می دی اما تو کدهای من یه تیبل هست


مشکل شما با تیبل چیست !؟

aghayex
دوشنبه 21 فروردین 1391, 19:55 عصر
قفله یعنی Lock میکنید تا کاربر نتونه کاری بکنه !؟
باز هم بهتر از اینه که Not responding باشه
در ضمن اگر در BackgroundWorker کار کنید میتونید یک progressbar داشته باشید و با کمک اون پیشرفت کارو نشون بدید که خیلی برنامه بهتر میشه و حرفه ای تر.

لازم نیست تغیرات گرید رو رکورد به رکورد نشون بدید، برنامه خیلی کند میشه

مثالهایی که در مورد BackgroundWorker بود فقط اومده یه متغیر رو از تابع dowork پاس داده و در رویداد ProgressChanged به شی نصبتش می دی اما تو کدهای من یه تیبل هست


مشکل شما با تیبل چیست !؟

ممنون که در این بحث شرکت کردی اما جوابهای شما بیشتر سوال بود تا ارائه ی راهکار
و سوال و هم کدها مطلب منو به طور کامل رسونده و جای سوالی نموده نمی دونم شما چرا اینقدر سوال رو می پیچونی .
از دوستانی که در این مورد کار کردن این درخواستو دارم که منو در عیب یابی این مشکل کمک کنن