تقييم الموضوع :
  • 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





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


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


الردود في هذا الموضوع
كيف أتمكن من إنتظار مهام متعددة Threading.Tasks.Task حتى تنتهي جميعها - بواسطة Othman Al Zamani - 03-11-22, 01:47 PM

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

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


يقوم بقرائة الموضوع: