DCSIMG
Question from Tapuz .Net forum: How to start an ASP.Net Async process from the Client? - Justin myJustin = new Justin( Expriences.Current );

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 שלך שתבצע את העבודה בצד-שרת.

    // in myPage.aspx.cs

    [WebMethod()]

    public static bool DoSomeHeavyLifiting()

    {

        // Do some very long calculations

        Thread.Sleep(10000);

        return true;

    }

עכשיו תצטרך לפנות למתודה הזו בצד-שרת מתוך ג'אווה סקריפט.
חלק א' יהיה להוסיף קריאה למתודה צד-שרת באמצעות לחיצה על למשל כפתור בצד-לקוח.
חלק ב' יהיה לתפוס את התוצאה מהצד שרת.

// in myPage.aspx

<asp:Button ID="btn1" runat="server" OnClientClick="CallPageMethod(); return false;" />

<script type="text/javascript">

function CallPageMethod()

{

   PageMethods.DoSomeHeavyLifiting(onFinishedHeavyLifting);

}

function onFinishedHeavyLifting(result)

{

   alert(result);

}

</script>

מה שקיבלנו למעשה זה את היכולת לדבר עם המתודות בצד-שרת מתוך ג'אווה סקריפט צד-לקוח וכל זה קורה כברירת מחדל בצורה א-סינכרונית.

עוד על תקשורת בין צד-שרת לצד-לקוח יהיה ניתן לשמוע בהרצאה שלי ב-31 לינואר כחלק מאירוע הענק של מיקרוסופט ה-Devleoper Academy.
ההרשמה לאירוע ולהרצאות חינם, אך מספר המקומות מוגבל ל-2,500 איש.

 

קישור: http://www.tapuz.co.il/tapuzforum/main/Viewmsg.asp?forum=831&msgid=91942269

Published Friday, January 05, 2007 11:08 PM by Justin-Josef Angel [MVP]

Comments

No Comments