PDA

View Full Version : استفاده از نخ در زمان انتظار پاسخ وب سرویس



damanpak
سه شنبه 08 مهر 1393, 01:18 صبح
سلام به اساتید
دوستان فرض کنید میخوام قبل از ارسال یک سری اطلاعات به وب سرویس چک کنم که آیا
ارتباط با وب سرویس برقراره یا خیر در حالتی که ارتباط برقرار باشه در عرض مثلا 3 ثانیه و یا
کمتر از وب سرویس جواب میگیرم و درحالتی که ارتباط قطع باشه ممکنه 10 تا 15 ثانیه برنامه ام
منتظر جواب از وب سرویس باشه
واسه این کار قطعه کدی با استفاده از نخ نوشتم به این شرح

Dim StartSecound As Integer = 1,XthreadConnection as Thread
Dim InputBoolean as Boolean=True
XthreadConnection = New Threading.Thread(Sub()
TestConnection()
End Sub)
XthreadConnection.Start()
While XthreadConnection.IsAlive And StartSecound < 25000000
StartSecound += 1
If StartSecound >= 25000000 Then InputBoolean = False
End While
XthreadConnection.Abort()
Return InputBoolean


زمانی که StartSecound = 25000000 یعنی برنامه مدت 4 ثانیه رو منتظر جواب بوده و اگه به این مقدار برسه برنامه از حقه خارج میشه و میره خط بعدی
اما وقتی به خط XthreadConnection.Abort() میرسم برنامه مدت طولانی رو رو این خط میمونه در صورتی که من جهت جلوگیری از انتظار طولانی کاربر از نخ استفاده کزدم.ضمنا این تابع قبل از هر بار ارسال داده ها باید چک بشه
حال چه راه حلی واسه اینکه برنامه فقط مدت مثلا 3 ثانیه متظر جواب از وب سرویس باشه رو پیشنهاد میدین؟

damanpak
سه شنبه 08 مهر 1393, 14:54 عصر
34 مشاهده دریغ از یک نظر؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟:متعج ::متعجب::متعجب::متعجب::متعجب: :متعجب::متعجب::متعجب::متعجب:
اصلا یه سوال!!!!!!!!!
چرا گاهی اوقات که ما میخوایم یک نخ رو از بین ببریم(XthreadConnection.Abort())این عمل کند انجام میشه؟

Mani_rf
سه شنبه 08 مهر 1393, 16:20 عصر
اگر داری از .Net 4.5 استفاده میکنی بجای ترد از async که برای این کار ایجاد شده استفاده کن.
برای اطلاعات بیشتر اینجا (http://msdn.microsoft.com/en-us/library/hh191443.aspx)رو بخون

damanpak
سه شنبه 08 مهر 1393, 16:57 عصر
سلام و تشکر از پاسختون اما بنده برنامه ام با دات نت 4 طراحی شده

Mani_rf
سه شنبه 08 مهر 1393, 17:13 عصر
روشی که برای منتظر موندن به کاربردی استاندارد نیست، این روش ممکنه روی سیستم های مختلف زمان های متفاوتی تولید کنه. While رو حذف کن Threading.Thread.Wait استفاده کن و زمان انتظار رو به میلی ثانیه بهش بده. فعلا این رو تست کن

damanpak
سه شنبه 08 مهر 1393, 19:29 عصر
سلام
بنده هرچی گشتم عبارت Threading.Thread.Wait رو پیدا نکردم
بجاش عبارات Threading.Thread.SpinWait() و Threading.Thread.VolatileWrite() رو پیدا کردم.کدومش درسته؟

Mani_rf
چهارشنبه 09 مهر 1393, 16:02 عصر
System.Threading.Thread.Sleep(5000)

damanpak
پنج شنبه 10 مهر 1393, 13:44 عصر
دوست عزیز جناب Mani_rf (http://barnamenevis.org/member.php?81144-Mani_rf) تشکر از پاسخ و همکاریتون
اما دستور Thread.Sleep(5000) بدین معنی هست که ما به اون نخ میگیم به مدت 5 ثانیه کلا دست از کار بکش و بعد 5 ثانیه دوباره شروع به کار کن
حال اگه مثلا ما در عرض 2 ثانیه از وب سرویس جواب بگیریم در حالتی که اتصال برقراره با این دستور میشه 7 ثانیه پس جواب مورد نظر نیست

Mani_rf
پنج شنبه 10 مهر 1393, 17:34 عصر
آره درسته حق با شماست. من چون عجله داشتم خیلی به کد شما دقت نکردم و فکر کردم که فقط میخوای یک فاصله زمانی ایجاد کنی و بعد چک کنی ببینی اجرا شده یا نه.

Mani_rf
جمعه 11 مهر 1393, 00:06 صبح
این مشکلی که میگید ممکنه که توی حالت Release اتفاق نیوفته، این مورد را هم چک کن.

damanpak
جمعه 11 مهر 1393, 02:56 صبح
سلام مجدد
این مشکل رو با استفاده از Ping تقریبا حل کردم گرچه بیشتر دوست داشتم واسه نخ راه حلی پیدا بشه
تعجبم که چطور نخ ها خاصیت Timeout ندارن
بهرحال تشکر از دوستان

Mani_rf
شنبه 12 مهر 1393, 22:47 عصر
گفتی میخوای یک وب سرویس دیتا بفرستی! خب چرا تو تنظیمات وب سرویس Timeout رو مشخص نمیکنی؟!؟

Dim message As Services.ServiceReference.MessageClient = New ServiceReference.MessageClient
message.InnerChannel.OperationTimeout = New TimeSpan(0, 0, 10)

تو این کد من برای زمان پاسخ وب سرویسم 10 ثانیه تعیین کردم.
امیدوارم این کد کمک کنه.