Как вырваться из Parallel.ForEach внутри Задачи - PullRequest
0 голосов
/ 19 января 2020

Я запускаю Parallel.ForEach в качестве задачи. Я хочу выйти из этого, когда определенное условие выполнено. Рассмотрим ниже:

            Dim opt As System.Threading.Tasks.ParallelOptions = New System.Threading.Tasks.ParallelOptions With {
                .MaxDegreeOfParallelism = My.Settings.ssUserMaxThreads}

            Dim ttask = Task.Factory.StartNew(Sub()

                                                  Parallel.ForEach(filesList, opt,
                                                    Sub(rom As String)

                                                        ProcessROM(rom, romDS, ClassHash)

                                                        totalCount += 1
                                                        Debug.WriteLine("TotalCount: " & totalCount)

                                                        If totalCount > LimitedNumber Then
                                                            Debug.WriteLine("Limited number exceeded")
                                                            'What here?
                                                        End If

                                                        con.Invoke(CType(Sub()
                                                                             ReportProgress()
                                                                         End Sub, Action))

                                                        Application.DoEvents()

                                                    End Sub
                                                    )

                                              End Sub)

            Do Until totalCount > LimitedNumber
                Application.DoEvents()
            Loop

Как мне выйти из этого Parallel.ForEach ИЛИ Task рано, если totalCount> LimitedNumber?

1 Ответ

0 голосов
/ 19 января 2020

Вы можете использовать класс ParallelLoopState, передав переменную внутри sub. Разрыв - это метод, который полезен в вашем случае.

       Parallel.ForEach(filesList, opt, Sub(rom As String, state as ParallelLoopState)
                        ProcessROM(rom, romDS, ClassHash)

                        .........
                        .........
                        If totalCount > LimitedNumber Then
                        Debug.WriteLine("Limited number exceeded")
                          state.Break();
                        End If
            ...........
            .........

Подробнее см. https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.parallelloopstate?view=netframework-4.8

...