VB.NET Параллельно для каждой таблицы данных в наборе данных

#vb.net #parallel-processing #dataset

Вопрос:

Я создаю код для тестирования перебора таблиц в наборе данных, используя параллель для каждого цикла, но я получаю ошибку. Ошибка связана с тем, что при вызове ForEach возникает синтаксическая ошибка с ошибкой разрешения перегрузки. Пожалуйста, дайте мне знать, что я делаю неправильно в следующем коде:

 Dim ds As New DataSet
Dim dt As New DataTable
Dim dr As DataRow

ds.Tables.Add()
ds.Tables(0).Columns.Add("Col1", GetType(String))
ds.Tables(0).Columns.Add("Col2", GetType(String))
ds.Tables(0).Columns.Add("Col3", GetType(String))
ds.Tables(0).Columns.Add("Col4", GetType(String))

dr = ds.Tables(0).NewRow()
dr("Col1") = "Loaded"
dr("Col2") = "Col 2 Data"
dr("Col3") = "Col 3 Data"
dr("Col4") = "Col 4 Data"
ds.Tables(0).Rows.Add(dr)

ds.Tables.Add()
ds.Tables(1).Columns.Add("Col1", GetType(String))
ds.Tables(1).Columns.Add("Col2", GetType(String))
ds.Tables(1).Columns.Add("Col3", GetType(String))
ds.Tables(1).Columns.Add("Col4", GetType(String))

dr = ds.Tables(1).NewRow()
dr("Col1") = "Loaded"
dr("Col2") = "Col 2 Data"
dr("Col3") = "Col 3 Data"
dr("Col4") = "Col 4 Data"
ds.Tables(1).Rows.Add(dr)

Parallel.ForEach(
ds.Tables.Cast(Of DataTable),
Sub(table)
    ProcessTable(table)
End Sub
)
 

Комментарии:

1. Я ценю полный пример. Однако он работает просто отлично, когда ProcessTable(DataTable) пуст. Можете ли вы поделиться определением этого метода, а также любыми перегрузками (что, по-видимому, является ошибкой)?

2. Большое тебе спасибо, диджей. Когда я прокомментировал строку ProcessTable, ошибка в начале исчезла. Пока нет определения метода, называемого ProcessTable… лол, я предположил, что если внутри параллельного модуля произошла ошибка, то ошибка будет отображаться в строке, а не в вызове ForEach. Когда я увидел ошибку в ForEach, я предположил, что произошла ошибка в синтаксисе самого ForEach.

3. Так что это то, что мы называем опечаткой 🙂

4. Это означает, что я только начинаю свой путь к пониманию параллельной обработки. Я завершил свой тестовый код и хотел бы опубликовать его здесь для всех, кому это может помочь, но он слишком длинный для комментариев. Как я могу это опубликовать?

5. Фактическая ошибка была просто опечаткой, так что действительно ли публикация вашего кода здесь для потомков кому-нибудь поможет? Я имею в виду, что код, который вы опубликовали выше, уже не вызывает проблем, если предположить, что ProcessTable определен, и на самом деле не имеет значения, что внутри него, как я уже упоминал в своем первом комментарии. На вашем месте я бы просто оставил все как есть — и к вашему сведению, этот вопрос будет закрыт очень скоро, как только за это проголосует третье лицо, поэтому я бы не беспокоился о публикации вашего тестового кода

Ответ №1:

Ответ, как указал djv, заключается в том, что с кодом нет никаких проблем.

Компилятор жаловался, что метода ProcessTable не существует. Компилятор просто сбил меня с толку, поместив ошибку в строку вызова ForEach вместо вызова метода ProcessTable.