the calling thread cannot access this object در WPF

با سلام

من به خطای زیر در برنامه برخورد کردم:
the calling thread cannot access this object because a different thread owns it​
در واقع میخوام نتایج کوئری دیتابیس را در قالب چندین user controlای که خودم تعریفش کردم روی stackpanel ایجاد کنم بدین صورت:
کد:
private void ReceiveFeedsFromServer()
{
....
foreach (DataRow feed in feeds)[/LEFT]
                {
                    Share.feed = feed;
                    Thickness margin = new Thickness(0, 10, 0, 0);
                    FeedUser feed_info = new FeedUser();
                    feed_info.Margin = margin;




                    Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { postPanel.Children.Add(feed_info); }));


[LEFT]                }
موقع call کردن متد هم کدهای زیر را زدم اما باز خطا میده:
کد:
 Thread thread = new Thread(new ThreadStart(ReceiveFeedsFromServer));[/LEFT]
                thread.SetApartmentState(ApartmentState.STA);
[LEFT]                thread.Start();
.....
}

هر کاری میکنم همون خطا رو میده. لطفا راهنمایی کنید.
 

the_king

مدیرکل انجمن
با سلام

من به خطای زیر در برنامه برخورد کردم:
the calling thread cannot access this object because a different thread owns it​
در واقع میخوام نتایج کوئری دیتابیس را در قالب چندین user controlای که خودم تعریفش کردم روی stackpanel ایجاد کنم بدین صورت:
کد:
private void ReceiveFeedsFromServer()
{
....
foreach (DataRow feed in feeds)[/LEFT]
                {
                    Share.feed = feed;
                    Thickness margin = new Thickness(0, 10, 0, 0);
                    FeedUser feed_info = new FeedUser();
                    feed_info.Margin = margin;




                    Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { postPanel.Children.Add(feed_info); }));


[LEFT]                }
موقع call کردن متد هم کدهای زیر را زدم اما باز خطا میده:
کد:
 Thread thread = new Thread(new ThreadStart(ReceiveFeedsFromServer));[/LEFT]
                thread.SetApartmentState(ApartmentState.STA);
[LEFT]                thread.Start();
.....
}

هر کاری میکنم همون خطا رو میده. لطفا راهنمایی کنید.
در فرم های عادی ویندوز متد اغلب کنترل ها فقط توسط Thread سازنده شون قابل دسترسی اند و وقتی از Thread دیگری سراغ شان می روید و فرضا می خواهید Add کنید
مشابه این خطای the calling thread cannot access this object because a different thread owns it رخ میده، ولی ساختن شیء کنترلی می تونه در هر Thread ای انجام بشه.
اما در WPF محدودیت از اینم بیشتر ئه، شما حتی اون ()new FeedUser رو هم باید توی Thread سازنده اجرا کنید. اگر بخواهید شیء کنترلی رو روی پنجره ای قرار بدید، هم باید ساختن شیء و هم قرار دادنش در همون
Thread سازنده پنجره باشه.

کد:
            Share.feed = feed;
            Thickness margin = new Thickness(0, 10, 0, 0);
            Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate 
                {
                    FeedUser feed_info = new FeedUser();
                    feed_info.Margin = margin;
                    postPanel.Children.Add(feed_info);
                }));

البته در نظر بگیرید که وقتی دارید برای پنجره ای کد می نویسید، this.Dispatcher نسبت به Application.Current.Dispatcher خوانا تر ئه.
 

جدیدترین ارسال ها

بالا