PDA

View Full Version : سوال: جلو گیری از هنگ کردن برنامه



lootiamir
شنبه 01 تیر 1392, 12:35 عصر
سلام ببخشید من یه کار نسبتا سنگین میخوام تو نرم افزارم انجام بدم که نرم افزار هنگ میکنه و زمان زیادی میبره تا درست بشه !
میخواستم بدونم به جز Backgroung Worker از چه روش هایی میشه برای جلوگیری از هنگ کردن برنامه استفاده کرد؟؟

tooraj_azizi_1035
شنبه 01 تیر 1392, 15:48 عصر
یکی از این روش ها استفاده از کلمات کلیدی async و await هست:

' Three things to note in the signature:
' - The method has an Async modifier.
' - The return type is Task or Task(Of T). (See "Return Types" section.)
' Here, it is Task(Of Integer) because the return statement returns an integer.
' - The method name ends in "Async."
Async Function AccessTheWebAsync() As Task(Of Integer)

' You need to add a reference to System.Net.Http to declare client.
Dim client As HttpClient = New HttpClient()

' GetStringAsync returns a Task(Of String). That means that when you await the
' task you'll get a string (urlContents).
Dim getStringTask As Task(Of String) = client.GetStringAsync("http://msdn.microsoft.com")


' You can do work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork()

' The Await operator suspends AccessTheWebAsync.
' - AccessTheWebAsync can't continue until getStringTask is complete.
' - Meanwhile, control returns to the caller of AccessTheWebAsync.
' - Control resumes here when getStringTask is complete.
' - The Await operator then retrieves the string result from getStringTask.
Dim urlContents As String = Await getStringTask

' The return statement specifies an integer result.
' Any methods that are awaiting AccessTheWebAsync retrieve the length value.
Return urlContents.Length
End Function


در کد بالا متد GetStringAsync به طور ناهمگام یعنی روی تردی دیگر اجرا می شود و همزمان با اجرای آن ( یعنی بدون انتظار برای گرفتن مقدار بازگشتی از سوی GetStringAsync) متد DoIndependentWork که بیانگر کاری است که وابستگی به مقدار بازگشتی GetStringAsync ندارد اجرا می شود.

و بعد با رسیدن به کلمه کلیدی await برنامه منتظر گرفتن خروجی GetStringAsyncمی ماند و بقیه کد به عنوان Callback پس از اجرای خطی که await در آن قرار دارد اجرا خواهد شد. در اینجا UI کاملاً آزاد است چون این اتفاقات روی Thread ای غیر از UI انجام می شود.
منبع:http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1

lootiamir
شنبه 01 تیر 1392, 17:37 عصر
یکی از این روش ها استفاده از کلمات کلیدی async و await هست:

' Three things to note in the signature:
' - The method has an Async modifier.
' - The return type is Task or Task(Of T). (See "Return Types" section.)
' Here, it is Task(Of Integer) because the return statement returns an integer.
' - The method name ends in "Async."
Async Function AccessTheWebAsync() As Task(Of Integer)

' You need to add a reference to System.Net.Http to declare client.
Dim client As HttpClient = New HttpClient()

' GetStringAsync returns a Task(Of String). That means that when you await the
' task you'll get a string (urlContents).
Dim getStringTask As Task(Of String) = client.GetStringAsync("http://msdn.microsoft.com")


' You can do work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork()

' The Await operator suspends AccessTheWebAsync.
' - AccessTheWebAsync can't continue until getStringTask is complete.
' - Meanwhile, control returns to the caller of AccessTheWebAsync.
' - Control resumes here when getStringTask is complete.
' - The Await operator then retrieves the string result from getStringTask.
Dim urlContents As String = Await getStringTask

' The return statement specifies an integer result.
' Any methods that are awaiting AccessTheWebAsync retrieve the length value.
Return urlContents.Length
End Function


در کد بالا متد GetStringAsync به طور ناهمگام یعنی روی تردی دیگر اجرا می شود و همزمان با اجرای آن ( یعنی بدون انتظار برای گرفتن مقدار بازگشتی از سوی GetStringAsync) متد DoIndependentWork که بیانگر کاری است که وابستگی به مقدار بازگشتی GetStringAsync ندارد اجرا می شود.

و بعد با رسیدن به کلمه کلیدی await برنامه منتظر گرفتن خروجی GetStringAsyncمی ماند و بقیه کد به عنوان Callback پس از اجرای خطی که await در آن قرار دارد اجرا خواهد شد. در اینجا UI کاملاً آزاد است چون این اتفاقات روی Thread ای غیر از UI انجام می شود.
منبع:http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1
داداش دمت گرم فقط میشه یه خورده عامیانه تر توضیح بدی !!!

lootiamir
شنبه 01 تیر 1392, 21:55 عصر
چی شد پس؟؟

milad.biroonvand
شنبه 01 تیر 1392, 22:58 عصر
بهترین راه استفاده از سیستم چند نخی هست. و یا اینکه یک سرویس دهنده ویندوز ایجاد کنید.

maxvel
شنبه 01 تیر 1392, 22:59 عصر
دقیقا میخوای چکار کنی؟؟؟

تو چه کدی هنگ میکنه؟

tooraj_azizi_1035
یک شنبه 02 تیر 1392, 10:52 صبح
عامینه ش این میشه که تو هر متدی که قرار کار زمان بری انجام بدی می تونی از این دو کلمه کلیدی استفاده کنی.
متدهای Async خروجی شون از نوع Task(Of T) هست یعنی یک Task بر می گردونن.
await رو پشت متغیری که خروجی کار زمان بر رو برمیگردونه باید بذاری.
کدهای بعد از خطی که await هست بعد از تکمیل اون متد زمان بر اجرا میشه. فقط اگه کدی داری که وابسته به خروجی متد زمان بر نیست می تونی اون رو بعد از صدا زدن متد زمان بر قرار بدی که تو مثال بالا DoIndependentWork منظورمه.

از این ساده تر نمی تونم بگم چون خود بحث کمی پیچیده است مخصوصاً روند اجراش اما لینک رو بخونی واقعاً متوجه میشی.
استفاده از این دو کلمه کلیدی از این به بعد "عادی" تلقی می شه.:لبخندساده:

lootiamir
یک شنبه 02 تیر 1392, 12:35 عصر
دقیقا میخوای چکار کنی؟؟؟

تو چه کدی هنگ میکنه؟
یه چیز تو مایه های BackGround Worker باشه ولی بشه به اجزاری فرم دسترسی داشت !

armin001
یک شنبه 02 تیر 1392, 15:47 عصر
درود
میتونید از thread ها استفتده کنید هروقت هم نیاز به دسترسی به اشیا فرم داشتید میتونید از Invoke استفاده کنید

اگه با thread ها آشنایی ندارید میتونید توی این سایت سرچ کنید Thread یا threading

به اینجا ها هم یه سری بزن

http://barnamenevis.org/showthread.php?275344-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AC%D8%A7%D9%85%D8%B9-Threading-%D9%88-%D9%85%D8%A8%D8%A7%D8%AD%D8%AB-%D9%85%D8%B1%D8%A8%D9%88%D8%B7%D9%87-%D9%85%D8%AB%D9%84-synchronization&highlight=thread


http://barnamenevis.org/showthread.php?398032-%DA%86%D8%B1%D8%A7-%D8%AF%D8%A7%D8%AE%D9%84-%DB%8C%DA%A9-Thread-%D9%86%D9%85%DB%8C%D8%AA%D9%88%D8%A7%D9%86-%D8%AE%D8%B5%D9%88%D8%B5%DB%8C%D8%A7%D8%AA-%DB%8C%DA%A9-%DA%A9%D9%86%D8%AA%D8%B1%D9%84-%D8%B1%D8%A7-%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D8%AF%D8%A7%D8%AF%D8%9F%D8%9F%D8%9F&highlight=thread

maxvel
یک شنبه 02 تیر 1392, 19:32 عصر
یه چیز تو مایه های BackGround Worker باشه ولی بشه به اجزاری فرم دسترسی داشت !

مثلا اگه تو دستور for باشه و برنامه هنگ کنه میشه با sleep درستش کرد

چه مشکلی با background worker داری؟

lootiamir
یک شنبه 02 تیر 1392, 20:21 عصر
مثلا اگه تو دستور for باشه و برنامه هنگ کنه میشه با sleep درستش کرد

چه مشکلی با background worker داری؟
ببخشید دستور sleep چیه ؟؟؟ میشه تو ضیح بدین یا یه مثال بزنین !!!
با Background Worker نمیشه به اجزای فرم دسترسی پیدا کرد !!