PDA

نسخه کامل مشاهده نسخه کامل : ايجاد يک Object مشترک بين Application Domain



mespio
15-07-2008, 00:10
با سلام.مي خواستم يک داده ي اشتراکي بين دو AppDomain متفاوت ايجاد کنم. مثل Mutex, Semapher, و يا EventwaitHandle . کمي تو کلاس MarshalByRefObject کيج شدم. ممنون مي شم بتونيد کمکم کنيد.
با تشکر

someone
15-07-2008, 16:22
سلام
در Net. کلاسی به نام Mutexوجود داره که به راحتی می تونین از اون برای به اشتراک گذاشتن
یک Resource بین دو Thread استفاده کنید. در ساده ترین حالت کافی Resource مورد نظرتون رو
بین دو متود WaitOne و ReleaseMutex قرار بدین/
و همین طور در مورد Semaphore .
از Semaphore برای محدود کردن تعداد دسترسی ها به یک Resource مشخص هست. مثلا به طور همزمان
تنها 3 Thread میتونین به یک Object دسترسی داشته باشن و Thraed چهارم باید در انتظار بمونه.
برای استفاده از اون کافی از دو متود WaitOne و Release استفاده کنین.

در مورد این کلاس ها نمونه ها و مثال های زیادی وجود داره.
اگه نیاز به توضیح بیشتر داشت خبر بدین.
موفق باشین.

mespio
17-07-2008, 01:48
شناخت کامل و جامع روی Mutex, semaphore ,EventWaitHandle دارم. اما سوال من راجب دسترسی به Typed define هایی که از MarshalByRefObject به ارث می بره تا بشه بین AppDomain ها آن تایپ رو مشترکا به ارث برد.
برای مثال فرض کنید من می خواهم مسئله تولید کننده- مصرف کننده رو با Monitor تو دو AppDomain متفاوت و به صورت همزمان با هم داشته باشم. حال سوال اینجاست که چطوری میشه آن Object که واسه Lock کردن از طریق Monitor انجام میشه بین تو تا AppDomain استفاده کرد.
این مسئله رو با Mutex و Semaphore و EventWaitHandle حل کردم. اما با Monitor روی آبجکت واسه Lock کردن هنوز نتونستم!
باز هم ممنون از لطفتون که اگه تونستید راهنمایی کنید.
ممنون

someone
17-07-2008, 09:38
دوباره سلام
همونطور که خودتون می دونین ارتباط بین AppDomain های متفاوت از دو طریق انجام میشه
1- انتقال یک Copy از همه محدوده ی AppDomain
2-استفاده از یک Proxy برای Message Exchanging
از طرف دیگه باز همونطور که شما نوشتین Type ها باید از کلاس MarshalByRefobject به ارث
برده بشن. که دلیل استفاده از MarshalByRefobject کاملا روشنه.

در اینجا سوالی برای من پیش اومده.
در مورد مساله ی procuder-costomer شما هر کدوم از بخش ها رو در یک AppDomain
ایجاد کردین؟ میتونم نحوه پیاده سازی شما رو ببینم؟ ضمنا تعریفتون از Application Domain چیه؟



اما اگه سوالتون در مورد استفاده از Monitor در مساله ی گفته شده است به کد زیر مراجعه
کنین:[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

_H2_
17-07-2008, 18:19
سلام
با اجازه کاربر someone...
این چیزی که شما نیاز دارید، ارتباطات DDE است که در VB6 پشتیبانی میشد ولی مایکروسافت آنرا در دات نت حذف کرد، چون چندان منطقی نمیدانست! (گرچه هنوز خود explorer مایکروسافت در جاهایی از ان استفاده میکند)

- اگر برنامه شما در یک PC واحد اجرا میشود که به جای ایجاد چند برنامه برای چند پنجره یک برنامه واحد MDI بسازید که چند Child داشته باشد.

- اگر هم برنامه در چند PC متفاوت باید به هم وصل شوند که باید از سوکت استفاده کنید.

راه اصولی اینها هستند.

ولی اگر بر انجام این عمل پافشاری دارید، چند راه دارید.
1- اگر یکی از برنامه ها دیگری را راه اندازی میکند یا این که یکی از برنامه ها در هر لحظه فقط یک نسخه اش میتواند در RAM باشد، میتوانید شی ای در حافظه قرار دهید و آدرس آن مکان را با خط Command به برنامه دوم پاس دهید تا به آن نقطه رجوع کند.

2- برای ارسال اطلاعات میتوان از کلاسس System.Diagnostics.Process استفاده کرد ولی من فقط روی نوع Consol میدانم که جواب میدهد و بعید میدانم برای برنامه های عادی جواب دهد.

3- هنوز هم میتوانید از برنامه نویسی سطح سوکت و یا Net Remoting استفاده کنید.

4- مطمئن نیستم ولی فک کنم API های DDE در user32 باشد که اگر به مرجع msdn مراجعه کنید، شاید هنوز بتوانید از این تکنولوژی، قبل از انقراض استفاده کنید.

اگر توضیح دهید برای چه به همچین کدی نیاز دارید و چه میخواهید بکنید، میشود راه حل های جدید و اصولی بهتری را معرفی کرد.

موفق باشید.

mespio
19-07-2008, 09:59
سلام بر دو دوست گرامی
کاربر Someone من می خوام بدونم که چطوری می تونم با تبادل پیام کار کنم؟ حالا که کلاسی رو از Marshal ارث بری کردم چطوری می شه یک proxy از آن شئی در یک AppDomain دیگر استفاده کرد؟
منظورمو با یک مثال ساده بیان می کنم:
"فرض کنیم دو ConsoleApplication داریم که بین این دو یک Object با استفاده از روش Message Exchanging
با هم ارتباط دارند.به طوری که اگه هر کدام از آنها تغییری در Object ایجاد کند آن دیگری این تغییر را خواهد دید. حال سوال اینجاست این ارتباط بین این دو برنامه چگونه ایجاد می شود تا هر دو بتوانند تغییرات را مشاهده کنند؟
فرض کنید هر دو برنامه(منظورم ConsoleApplication است)یک ناحیه بحرانی دارند که با استفاده از Monitor و آن Object مشترک بین دو برنامه قفل می شود.پس مسلما اگر هردو برنامه با هم اجرا شوند فقط یکی از آنها می تواند وارد ناحیه بحرانی شود به شرط اینکه این ارتباط برای Object مشترک بین دو برنامه درست باشد و دیگری منتظر می ماند تا Object هز حالت قفل خارج شود"
این کار را با Mutex و یا کلاس های برای کنترل در سطح سیستم عامل مثل EventWaiteHandle ها و ... انجام داده ام. فقط می خواهم با این نحوه هم انجام دهم.
چطوری می شود این ارتباط رو برقرار کرد و کار کرد؟
باز هم ممنون از لطف هر دو دوست عزیز