تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
كيف أتمكن من إنتظار مهام متعددة Threading.Tasks.Task حتى تنتهي جميعها
#1
Information 
السلام عليكم ورحمة الله وبركاتة

تحياتي لل الأعضاء الكرام

بعد محاولات كثيرة لم أستطع أو أستوعب ما هو المطلوب لكي أتمكن من إنتظار عدة مهام ( Tasks )
اقوم في Loop بالإلتفاف على جدول يحتوي على معلومات عن ملفات موجودة على الإنترنت ( اسم الملف ، الرابط ، وما إلى ذلك )
في كل لفة أقوم بإنشاء Task
وأضيف هذا ال Task في مجموعة لكي أستطيع الوصول إليه فيما بعد لدواعي الإلغاء ومعرفة حالة ال Task
وفي نفس اللفة أقوم بتشغيل ال Task
ثم أنتقل إلى ال Row الذي يليه ، وهكذا مع كل السجلات لتحميل جميع الملفات في نفس الوقت


الآن لدي مجموعة تحتوي على كل ال Task التي تم تشغيلها
في أثناء الإلتفاف على الجدول ، تم تمرير TaskCancelTokenSource إلى كل Task
حتى أتمكن من عمل إلغاء للكل

كل المهام تعمل في الخلفية وهذا شيء جيد
لكن 
المشكلة أنني عندما أنفذ عمل الإلغاء بواسطة :
Sub Cancel
( Me.TaskCancelTokenSource.Cancel ) ، تنتهي عملية الإلغاء بسرعة ، ولكن ال Task مازال يعمل على تنفيذ أمر الإلغاء

حتى أن الرسالة :
MsgBox("All Tasks Completed...")
تظهر مباشرتاً قبل حتى أن تبداء أي مهمة.

أي ان الرسالة التي تبين إنتهاء أو إلغاء جميع المهام تظهر قبل الرسالة الموجودة في آخر كل مهمة.

حاولت كثيراً , جربت أكواد من مواقع لكن كلها تعمل بشكل مختلف لا يوجد كود يشبه الآخر , لم أجد مثال طبقته بنجاح.

كيف يمكنني إنتظار إنتهاء جميع المهام ( سواء أكان إنتظار حتى تنتهي كلها ) ( أو إنتظار تنفيذ أمر الإلغاء للجميع )


ملاحظة :
الوظيفة ( GetFileContent ) + ( DownloadFileAsync ) تعمل بشكل متزامن Synchronously ، بإستخدام ال Async )  modifier )

كود :
    Dim TaskList As New List(Of Task)
    Dim TaskCancelTokenSource As CancellationTokenSource


    Private Sub StartAllDownloadTasks()

        Me.TaskCancelTokenSource = New System.Threading.CancellationTokenSource

        For Each Row In Me.DownloadSourceDataTable

            If Row.T_IsActive Then

                Dim DownloadTask As New Task(Sub()
                                                 Me.GetFileContent(Row)
                                             End Sub, Me.TaskCancelTokenSource.Token)
                Me.TaskList.Add(DownloadTask)
                DownloadTask.RunSynchronously()

            End If

        Next


        Dim AllTasks = Task.WhenAll(Me.TaskList.ToArray)
        ' نتظار جميع المهام حتى تنتهي
        AllTasks.Wait()

        ' هذا الرسالة تظهر مباشرتاً ولا تنتظر إنتهاء جميع المهام
        MsgBox("All Tasks Completed...")

    End Sub

    Private Async Sub GetFileContent(Row As DataSet1.HTTPFilesInfoRow)
        Do
            If Me.TaskCancelTokenSource.Token.IsCancellationRequested Then
                Exit Do
            End If

            Await Task.Delay(3000)

            Await DownloadFileAsync(Row.T_Link)

            RaiseEvent FileLoaded(Row)
        Loop


        MsgBox("Task Completed...")
    End Sub

    Private Async Function DownloadFileAsync(T_Link As String) As Task(Of Byte())
        Using MyHttpClient As New System.Net.Http.HttpClient()
            Dim GetFileAsync As Task(Of Byte()) = MyHttpClient.GetByteArrayAsync(T_Link)
            Dim FileContents As Byte() = Await GetFileAsync
            Return FileContents
        End Using
    End Function

    Public Sub Cancel()
        Me.TaskCancelTokenSource.Cancel()
        Task.WaitAll(Me.TaskList.ToArray)
        MsgBox("Canceled All")
    End Sub





ليس بالظرورة تعديل الكود المهم مثال ينجح في تطبيق مبداء إنتظار إنتهاء الكل أو إنتظار إلغاء الكل بعدها إستطيع إظهار رسالة تبين أنتهاء الكل أو إلغاء الكل، حتى اتمكن من الإنتقال لمرحلة أخرى بعد التأكد من خروج جميع المهام عن العمل وتوقفها.


أي محاولة ستكون محل تقدير وإمتنان , وشكراً.
الرد }}}
تم الشكر بواسطة:
#2
وعليكم السلام

أخي عثمان الكود الذي وضعته انت واضح ماذا تريد ، لكن لا يمكن إختبارة لوجود أخطاء ونواقص في الكود , لا يمكن تشغيلة
ضع مثال يمكن إختبارة من قبل الأعضاء, بهذة الطريقة لا احد يستطيع معرف النتيجة التي تحصل عليها انت.
الرد }}}
تم الشكر بواسطة:
#3
شكراً لك أخي عبدالله
هذة الأكواد قمت بعزلها من المشروع الأساسي
   

أتمنى أخي عبدالله يكون واضح الكود لأنه متعب جداً إخراج أكواد من مشروع كبير لتعمل بشكل مستقل.

أخواني الأعضاء بارك الله فيكم أحتاج المساعدة


الملفات المرفقة
.zip   Multi Task Waiting.zip (الحجم : 25.53 ك ب / التحميلات : 23)
الرد }}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  طريقة الضم LEFT JOIN متعددة بسام محمدغانم 0 827 03-11-21, 07:02 AM
آخر رد: بسام محمدغانم
  كود ترحيل إلى أوراق عمل متعددة في ملفات متعددة من ملف العمل أبو الخضر البعيثي 0 1,087 17-10-21, 10:12 PM
آخر رد: أبو الخضر البعيثي
  إستعمال ال Multi Threading عبد العزيز البسكري 37 6,484 20-10-20, 07:54 PM
آخر رد: asemshahen5
  [VB.NET] لو سمحت محتاج مساعدة في تنفيذ شريط مهام للمشروع MustafaShaker 2 1,619 15-08-20, 05:59 AM
آخر رد: MustafaShaker
  طباعة متعددة اعتماداً على DataGridView mr_hso 5 2,448 05-10-19, 06:26 AM
آخر رد: mr_hso
  ممكن توضيح كيف يتم ايقاف Threading dametucorazon 1 1,480 25-04-19, 04:30 PM
آخر رد: elgokr
  [VB.NET] widows task bar in vb.net forms aljzazy 2 1,678 06-09-18, 09:01 PM
آخر رد: aljzazy
  [VB.NET] إنهاء مهام الفورم larbihamri 6 2,712 22-07-18, 10:38 PM
آخر رد: elgokr
  [VB.NET] سؤال : الاستخدام الصحيح ل BackgroundWorker او Threading dubai.eig 11 4,305 05-10-17, 05:51 PM
آخر رد: silverlight
  [سؤال] ما حل مشكلة تعارض Task مع Sleep؟ السندبااد 6 2,812 20-09-17, 02:49 PM
آخر رد: السندبااد

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم