Как обрабатывать таблицы параллельно с Microsoft.AnalysisServices.Tabular - PullRequest
0 голосов
/ 31 мая 2019

Мне нужно создать программу, которая распараллеливает процесс списка таблиц, содержащихся в табличной модели.

Вот код, который я использую:

Server[] svrList = new Server[tables.getTables.Count];
Parallel.For(0, tables.getTables.Count, i =>
            {
                svrList[i] = ServerConnect(connectionString);
                Model m = svrList[i].Databases[database].Model;
                log.Info("process table " + tables.getTables.ElementAt(i).Name);
                Table t = m.Tables[tables.getTables.ElementAt(i).Name];
                t.RequestRefresh(Microsoft.AnalysisServices.Tabular.RefreshType.Full);
                m.SaveChanges();
                log.Info("Finish " + tables.getTables.ElementAt(i).Name);
                svrList[i].Disconnect();
            }
            );

в случае сбоя одной таблицы остальные должны загружаться правильно.

В этом коде таблицы обрабатываются правильно, но обрабатываются последовательно.

Я использую разные подключения к серверу для каждой таблицы, потому что, если я использую то же соединение, у меня появляется эта ошибка:

the connection cannot be used while an xmlreader object is open

Как я могу решить эту проблему?

Спасибо

1 Ответ

0 голосов
/ 01 июня 2019

Просто измените Parallel.For на обычный цикл for и переместите SaveChanges за пределы цикла. SaveChanges выполняет все команды, которые вы поставили в очередь. Он делает это параллельно внутри транзакции по умолчанию.

var conn = ServerConnect(connectionString);
Model m = conn.Databases[database].Model;
for (int i=0; i<tables.getTables.Count; i++)
{
     log.Info("process table " + tables.getTables.ElementAt(i).Name);
     Table t = m.Tables[tables.getTables.ElementAt(i).Name];
     t.RequestRefresh(Microsoft.AnalysisServices.Tabular.RefreshType.Full);
}
m.SaveChanges();
conn.Disconnect();
...