דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. Task Async: לולאה שמחזירה את התוצאות בצורה אסינכרונית

Task Async: לולאה שמחזירה את התוצאות בצורה אסינכרונית

מתוזמן נעוץ נעול הועבר ארכיון code613m
4 פוסטים 3 כותבים 329 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • A מנותק
    A מנותק
    avr416
    כתב ב נערך לאחרונה על ידי
    #1

    יש לי פונקציה שרצה על מערך של מילים (תוצאות חיפוש), ועל כל איבר במערך היא הולכת למקור ולוקחת משם את הקטע בו מופיעה המילה, כדי להציג אותו למשתמש.
    אני רוצה שעל כל איטרציה בלולאה - התשובה תחזור מיד ותוצג בUI ולא יצטרכו לחכות עד שהלולאה תיגמר.
    ראיתי בעבר שיש אפשרות לעשות זאת ע"י שימוש בTASK async אך אני לא מצליח למצוא בגוגל איך..
    (וגם לא איפה ראיתי זאת..)
    אם מישהו יודע איך - אשמח לשמוע.
    תודה רבה!

    פורסם במקור בפורום CODE613 ב17/05/2016 23:27 (+03:00)

    תגובה 1 תגובה אחרונה
    0
    • א מנותק
      א מנותק
      ארכיטקט
      כתב ב נערך לאחרונה על ידי
      #2

      תנסה לחפש על

      yield return c#

      יש לך

      סרטון שמסביר היטיב על המושג, ייתכן שזה יעזור לך אם אתה עובד עם WPF ויש לך שליטה על האירועים של זרימת החומר.

      בהצלחה.

      פורסם במקור בפורום CODE613 ב18/05/2016 00:07 (+03:00)

      אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

      תגובה 1 תגובה אחרונה
      1
      • dovidD מנותק
        dovidD מנותק
        dovid ניהול
        כתב ב נערך לאחרונה על ידי
        #3

        גישה לUI מTask כמו מטריד מחייבת קריאה לDispatcher. לכן גם yield לא יעזור כאן כי הUI יקפא עד לסיום הזרימה.
        הנה קוד דוגמה:

        public ObservableCollection<int> Collection { get; set; } = new ObservableCollection<int>();
        
        private void button_Click(object sender, RoutedEventArgs e)
        {
            Task.Run(() => getAll());
        }
        
        void getAll()
        {
            for (int i = 0; i < 3; i++)
            {
                Thread.Sleep(1000);
                Dispatcher.Invoke(() => Collection.Add(i));
            }
        }
        

        אבל אכן מה שארכיטקט הצביע על מעלת הyield לעבד את התוצאה תוך כדי עיבוד השאר עוזר להפרדה בין לוגיקת הלולאה לבין הטיפול בתוצאת כל איטרציה, הנה שינוי להמחשה:

        public ObservableCollection<int> Collection { get; set; } = new ObservableCollection<int>();
        
        private void button_Click(object sender, RoutedEventArgs e)
        {
            Task.Run(() =>
            {
                foreach (var item in getYield())
                    Dispatcher.Invoke(() => Collection.Add(item));
            });
        }
        
        IEnumerable<int> getYield()
        {
            for (int i = 0; i < 3; i++)
            {
                Thread.Sleep(1000);
                yield return i;
            }
        }
        

        זה אכן הרבה יותר טוב שהמתודה שעושה את העבודה לא דואגת לבעיות הUI של WPF.

        פורסם במקור בפורום CODE613 ב18/05/2016 00:22 (+03:00)

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        תגובה 1 תגובה אחרונה
        3
        • A מנותק
          A מנותק
          avr416
          כתב ב נערך לאחרונה על ידי
          #4

          תודה רבה רבה לשניכם!!
          עובד מעולה!

          פורסם במקור בפורום CODE613 ב18/05/2016 00:39 (+03:00)

          תגובה 1 תגובה אחרונה
          1

          בא תתחבר לדף היומי!
          • התחברות

          • אין לך חשבון עדיין? הרשמה

          • התחברו או הירשמו כדי לחפש.
          • פוסט ראשון
            פוסט אחרון
          0
          • דף הבית
          • קטגוריות
          • פוסטים אחרונים
          • משתמשים
          • חיפוש
          • חוקי הפורום