دوستان من یه دیتا گرید دارم که برای پر کردنش از یه تابع استفاده می کنم حالا می خام این رو در یه ترد مجزا انجام بدم آیا دوستان روشی سراغ دارند که بشه با اون از طریق یه ترد یا BackgroundWorker به اشیای ترد اصلی برنامه دسترسی داشت
دوستان من یه دیتا گرید دارم که برای پر کردنش از یه تابع استفاده می کنم حالا می خام این رو در یه ترد مجزا انجام بدم آیا دوستان روشی سراغ دارند که بشه با اون از طریق یه ترد یا BackgroundWorker به اشیای ترد اصلی برنامه دسترسی داشت
ممنون از جوابت اما این کد رو در کجا بنویسم
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();
}
وقتی شما از BackgroundWorker استفاده میکنید هر کدی که در ProgressChanged بنویسید به صورت Thread Safe است و میتوانید خصوصیات یک کنترل دیگه رو تغییر بدید.
فقط دیگه دست شما نیست که کی اون رویداد فراخونی میشه. ویندوز کنترلش می کنه . که چیز بدی نیست البته.
اگر قصد دارید به صورت دستی تغییر رو انجام بدید و نخ طراحی کنید. باید یک Deglegate بسازید و با مدیریت Invoke اینکارو انجام بدید. یکمی کد نویسی داره ولی زیاد سخت نیست.
مثالهایی که در مورد BackgroundWorker بود فقط اومده یه متغیر رو از تابع dowork پاس داده و در رویداد ProgressChanged به شی نصبتش می دی اما تو کدهای من یه تیبل هستوقتی شما از BackgroundWorker استفاده میکنید هر کدی که در ProgressChanged بنویسید به صورت Thread Safe است و میتوانید خصوصیات یک کنترل دیگه رو تغییر بدید.
مثالهایی هم که در مورد ترد بود همونی هست که در کدهای پست اول دادم ولی مشکلی که کدهای من داره اینه که برنامه تا زمانی که اطلاعات نمایش داده می شن برنامه قفله یعنی در عمل ترد بی معنی هستاگر قصد دارید به صورت دستی تغییر رو انجام بدید و نخ طراحی کنید. باید یک Deglegate بسازید و با مدیریت Invoke اینکارو انجام بدید. یکمی کد نویسی داره ولی زیاد سخت نیست.
قفله یعنی Lock میکنید تا کاربر نتونه کاری بکنه !؟
باز هم بهتر از اینه که Not responding باشه
در ضمن اگر در BackgroundWorker کار کنید میتونید یک progressbar داشته باشید و با کمک اون پیشرفت کارو نشون بدید که خیلی برنامه بهتر میشه و حرفه ای تر.
لازم نیست تغیرات گرید رو رکورد به رکورد نشون بدید، برنامه خیلی کند میشه
مشکل شما با تیبل چیست !؟مثالهایی که در مورد BackgroundWorker بود فقط اومده یه متغیر رو از تابع dowork پاس داده و در رویداد ProgressChanged به شی نصبتش می دی اما تو کدهای من یه تیبل هست
آخرین ویرایش به وسیله hakim22 : دوشنبه 21 فروردین 1391 در 15:19 عصر
ممنون که در این بحث شرکت کردی اما جوابهای شما بیشتر سوال بود تا ارائه ی راهکارقفله یعنی Lock میکنید تا کاربر نتونه کاری بکنه !؟
باز هم بهتر از اینه که Not responding باشه
در ضمن اگر در BackgroundWorker کار کنید میتونید یک progressbar داشته باشید و با کمک اون پیشرفت کارو نشون بدید که خیلی برنامه بهتر میشه و حرفه ای تر.
لازم نیست تغیرات گرید رو رکورد به رکورد نشون بدید، برنامه خیلی کند میشه
مثالهایی که در مورد BackgroundWorker بود فقط اومده یه متغیر رو از تابع dowork پاس داده و در رویداد ProgressChanged به شی نصبتش می دی اما تو کدهای من یه تیبل هست
مشکل شما با تیبل چیست !؟
و سوال و هم کدها مطلب منو به طور کامل رسونده و جای سوالی نموده نمی دونم شما چرا اینقدر سوال رو می پیچونی .
از دوستانی که در این مورد کار کردن این درخواستو دارم که منو در عیب یابی این مشکل کمک کنن