PDA

View Full Version : مبحث multithreading در wpf



aghayex
پنج شنبه 01 فروردین 1392, 22:36 عصر
با سلام
من در یه برنامه می خوام از multithreading استفاده کنم و منابعی رو هم با win from سی شارپ در این خصوص دیدم اما این تاپیک رو زدم تا شاید این مبحث در wpf متفاوت باشه و یا روش های نوینی اومده باشه حالا اگه دوستان اطلاعی دارن ارائه بدن ممنون می شم

tooraj_azizi_1035
جمعه 02 فروردین 1392, 12:06 عصر
سلام
تمام برنامه های WPF با دو Thread اجرا می شوند یکی برای UI و دیگری برای Rendering.
Rendering Thread در پس زمینه اجرا میشه. بنابراین Thread ای که شما با اون سرو کار دارید UI Thread هست.
WPF نیاز دارد تا بسیاری اشیای اون از طریق UI Threadمورد دستیابی قرار بگیرند که از اون به Thread Affinity هم یاد میشه. به این معنی که از یک شیء WPF فقط می تونید از طریق Thread ای که اون رو ایجاد کرده دست پیدا کنید. اقدام از طریق Thread دیگه باعث تولید Exception در زمان اجرا میشه. این thread affinity از طریق شیئی به نام Dispatcher مدیریت میشه که از اون به prioritized message loop for WPF applications یاد میشه.

http://i.msdn.microsoft.com/cc163328.fig01%28en-us%29.gif

Build More Responsive Apps With The Dispatcher
منبع: http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

aghayex
جمعه 02 فروردین 1392, 16:07 عصر
این خصوصیت که شما نمی تونید به یک شی که درون یک ترد هست و از یک تردد دیگه دسترسی داشته باشید در تمام زبان های دات نت برقرار است(البته در حالت عادی ) اما این یه چیز مطلق نیست و می شه طبق قواعدی دسترسی داشت من خودم چند نمونه کد می زنم اگه دوستان اطلاعاتی دارن بزنند تا یه تاپیک خوبی از نظر نمونه کد بشه .
حالتی هست که تابع ما هیچ ورودی نداشته باشه و در تابع هم ما دسترسی به اشیاء برنامه نداشته باشیم :

Static void main()
{
Thread t=new thread(writeY());
t.start();
}
Static void writeY()
{
While(true) console.write(“y”);
}



حالتی هست که تابع ما یک ورودی داشته باشه و در تابع هم ما دسترسی به اشیاء برنامه نداشته باشیم :

Static void main()
{
Thread t=new thread(writeY());
t.start(true);
}
Static void writeY(bool u)
{
console.write(u?“y”:”Y”);
}


حالتی هست که تابع ما چند ورودی داشته باشه و در تابع هم ما دسترسی به اشیاء برنامه نداشته باشیم :

Static void main()
{
Thread t=new thread(delegete(){writeY(true, 10 , 5 );});
t.start();
}
Static void writeY(bool u, int a,int b);
{
console.write(u ? a+b: a-b );
}