locked
קיבוץ מספר פעולות אסינכרוניות RRS feed

  • שאלה

  • סביבת עבודה:PRISM AND SILVERLIGHT

    אני מחפש תבנית אלגנטית לאגד קריאה למספר פונקציות ב SERVICES כאשר סדר הביצוע צריך להיות

    עוקב,כל פונקציה יכולה לקבל מספר אחר של פרמטרים ולהביא פרמטרים לפונקציה הבאה

    תודה

    יום שישי 03 פברואר 2012 08:28

תשובות

  • הפתרון האלגנטי הוא אכן async await כפי שציין אריאל, אבל לרוב המוחלט של הפרוייקטים זה עדיין לא רלוונטי (גרסאות preview הן אך ורק ללימוד).

    להשתמש בRX נראה לי overkill משמעותי, ולא הייתי בוחר בזה. במקום זה יש טריק קטן שמאוד מקל על עבוד עם services אסינכרונים, והוא לתת callback כחלק מהפרמטרים. זה הרבה יותר פשוט ממה שזה נשמע. את הסרביס עצמו נגדיר כך:

        public class MyService
        {
            public void DoSomethingAsync(int p1, int p2, Action Completed)
            { }
    
            public void DoSomethingWithReturnValueAsync(string s1, string s2, Action<string> compelted)
            { }
        }
    

     

    המתודה הראשונה לא מחזירה ערך (הcallback הוא callback ללא פרמטרים), בעוד המתודה השנייה מחזירה ערך מסוג מחרוזת. היופי בהגדרת הסרביס בצורה הזו הוא שהקריאה למתודות הופכת להיות הרבה יותר פשוטה ונעימה לעין (זה לא async של C#5, אבל זה עדיין שימושי מאוד):

    לדוגמא, קריאה למתודה הראשונה תראה כך:

                MyService service = new MyService();
    
                service.DoSomethingAsync(1, 2, () =>
                    {
                        MessageBox.Show("Completed");
                    });
    

     

    וקריאה משורשרת של שתי מתודות אסינכרוניות אחת אחרי השניה תראה כך:

                service.DoSomethingAsync(1, 2, () =>
                    {
                        service.DoSomethingWithReturnValueAsync("1", "2", ret =>
                            {
                                MessageBox.Show(ret);
                            });
                    });
    


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

     


    • נערך על-ידי Elad R Katz יום ראשון 05 פברואר 2012 07:44
    • סומן כתשובה על-ידי NoundaDee יום ראשון 05 פברואר 2012 07:58
    יום ראשון 05 פברואר 2012 07:43

כל התגובות

  • הפתרון האלגנטי הוא async await, שייצא בגרסא הבאה של C#.

    כרגע זה זמין בגרסת Preview, אם אתה מעוניין לחיות על הקצה, בבקשה: http://msdn.microsoft.com/en-us/vstudio/gg316360

    האופציה השנייה, היא להשתמש ב-Reactive Extensions, אולם קח בחשבון שאם אתה לא מכיר את הספרייה, יש עקומת למידה.

    http://stackoverflow.com/questions/6776700/managing-async-service-calls-using-silverlight-and-reactive-extensions


    Ariel Ben Horesh | twitter: @arielbh blog: http://blogs.microsoft.co.il/blogs/arielbh/
    יום שישי 03 פברואר 2012 12:51
  • הפתרון האלגנטי הוא אכן async await כפי שציין אריאל, אבל לרוב המוחלט של הפרוייקטים זה עדיין לא רלוונטי (גרסאות preview הן אך ורק ללימוד).

    להשתמש בRX נראה לי overkill משמעותי, ולא הייתי בוחר בזה. במקום זה יש טריק קטן שמאוד מקל על עבוד עם services אסינכרונים, והוא לתת callback כחלק מהפרמטרים. זה הרבה יותר פשוט ממה שזה נשמע. את הסרביס עצמו נגדיר כך:

        public class MyService
        {
            public void DoSomethingAsync(int p1, int p2, Action Completed)
            { }
    
            public void DoSomethingWithReturnValueAsync(string s1, string s2, Action<string> compelted)
            { }
        }
    

     

    המתודה הראשונה לא מחזירה ערך (הcallback הוא callback ללא פרמטרים), בעוד המתודה השנייה מחזירה ערך מסוג מחרוזת. היופי בהגדרת הסרביס בצורה הזו הוא שהקריאה למתודות הופכת להיות הרבה יותר פשוטה ונעימה לעין (זה לא async של C#5, אבל זה עדיין שימושי מאוד):

    לדוגמא, קריאה למתודה הראשונה תראה כך:

                MyService service = new MyService();
    
                service.DoSomethingAsync(1, 2, () =>
                    {
                        MessageBox.Show("Completed");
                    });
    

     

    וקריאה משורשרת של שתי מתודות אסינכרוניות אחת אחרי השניה תראה כך:

                service.DoSomethingAsync(1, 2, () =>
                    {
                        service.DoSomethingWithReturnValueAsync("1", "2", ret =>
                            {
                                MessageBox.Show(ret);
                            });
                    });
    


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

     


    • נערך על-ידי Elad R Katz יום ראשון 05 פברואר 2012 07:44
    • סומן כתשובה על-ידי NoundaDee יום ראשון 05 פברואר 2012 07:58
    יום ראשון 05 פברואר 2012 07:43
  • אלעד,האם אי אפשר לעשות T4 TEMPLATE שיצור   בצורה אוטומטית PROXY עם CALLBACKS?
    יום ראשון 05 פברואר 2012 08:29
  • אפשר בהחלט - זה רעיון טוב האמת.. :-)

    יום ראשון 05 פברואר 2012 08:36