Question from Tapuz .Net forum: How to start an ASP.Net Async process from the Client?
שאלה:
בשעת הלחיצה אני יוצר thread שמפעיל פונקציה במחלקה אחרת , לפני הפעלת ה thread אני מגדיר delegate + ManualResetEvent ,עכשיו המשתמש יכול מצידו לסגור את הדף הזה אך כמובן להשאר באפליקציה.
הבעיה שלי היא שאני לא יודע באיזהאני אני אוכל לתפוס את הEvent שה Thread סיים ולהציג למשתמש הודעה?
תשובה:
בוא ננסה רגע להגדיר את הבעיה מחדש, אתה רוצה לבצע פעולה "כבדה" בשרת ולהודיע ללקוח בדפדפן כאשר היא הסתיימה.
כל זה בלי לתקוע את הלקוח או השרת (כלומר, אסינכרוניות כפולה), ובתוך ההגבלה שאם הלקוח סוגר את הדפדפן או פשוט עובר דף כי לא מעניין אותו יותר אז אין למי לשלוח תגובה (עקב הגבלות של פרוטוקול HTTP).
אז כן, ניתן לפתוח Thread בצד-שרת שיבצע את העבודה הקשה והארוכה.
וניתן ליצור WaitHandle שיעברו את הטווח האסינכרוני וישמשו כ-Flagים ל-Thread שרשאי לדבר עם הלקוח.
ואז הלקוח יכול לדגום את השרת ולבדוק מתי העבודה הסתיימה.
אבל זה סיבוך משהו והמון עבודה.
Microsoft AJAX עושה בדיוק את מה שאתה מבקש.
AJAX מאפשר לך גישה א-סינכרונית לצד שרת למתודות ברמת הדף או ב-Webservice והוא דואג לביצוע הא-סינכרוני.
דבר ראשון תתקין Microsoft AJAX מהאתר ajax.asp.net (ההתקנה של Microsoft AJAX Library ושל December CTP).
תוסיף לדף <asp:ScriptManager>.
תוסיף מתודה ב-Code Behind שלך שתבצע את העבודה בצד-שרת.
עכשיו תצטרך לפנות למתודה הזו בצד-שרת מתוך ג'אווה סקריפט.
חלק א' יהיה להוסיף קריאה למתודה צד-שרת באמצעות לחיצה על למשל כפתור בצד-לקוח.
חלק ב' יהיה לתפוס את התוצאה מהצד שרת.
מה שקיבלנו למעשה זה את היכולת לדבר עם המתודות בצד-שרת מתוך ג'אווה סקריפט צד-לקוח וכל זה קורה כברירת מחדל בצורה א-סינכרונית.
עוד על תקשורת בין צד-שרת לצד-לקוח יהיה ניתן לשמוע בהרצאה שלי ב-31 לינואר כחלק מאירוע הענק של מיקרוסופט ה-Devleoper Academy.
ההרשמה לאירוע ולהרצאות חינם, אך מספר המקומות מוגבל ל-2,500 איש.
קישור: http://www.tapuz.co.il/tapuzforum/main/Viewmsg.asp?forum=831&msgid=91942269