Кажется, SMO не был создан в поточно-ориентированном режиме.Когда вы вызываете Script()
для Table
, он использует некоторое общее состояние из Server
, поэтому вы не можете выполнить его для двух таблиц из одного и того же Server
.Но вы можете обойти это, создав новый объект Server
для каждого Table
:
private static TableCollection GetTables()
{
Server server = new Server(…);
Database database = server.Databases[…];
var tables = database.Tables;
return tables;
}
…
Parallel.For(0, GetTables().Count,
i =>
{
var stringCollection = GetTables()[i].Script();
…
});
Это сделает ваши запросы параллельными, но я не знаю, сделает ли это их на самом деле быстрее.
РЕДАКТИРОВАТЬ: Если вы хотите создать один Server
для каждого потока, вы можете использовать перегрузку Parallel.For()
, которая позволяет локальной инициализации потока.Примерно так:
Parallel.For(0, GetTables().Count,
() => GetTables(),
(i, _, tables) =>
{
var stringCollection = tables[i].Script();
…
return tables;
},
tables => { });
Таким образом, каждый поток будет иметь свой собственный объект Server
, но только один.