У меня есть процесс, который анализирует данные аудита из одной системы для создания данных отчетов для другой системы.Существует процедура управления, которая зацикливается на каждый день для анализа и вызывает специфичную для сущности процедуру с текущим днем итерации.Некоторым объектам требуется меньше секунды, а другим - минуты.Работая поочередно, как в t-sql, загрузка ЦП никогда не превышает 8% на 16-ядерном сервере.Каждая из процедур, специфичных для объекта, не зависит от других, просто все объекты для этого дня завершены до начала следующего дня.
Моя идея состоит в том, чтобы иметь процедуру управления CLR и запускать более длинныйзапустив процедуры для дня, выполняющегося в их собственных потоках, затем, как только быстрые из них будут выполнены, Thread.Join () долго выполняющиеся потоки ожидают завершения всех сущностей за этот день, прежде чем перейти к следующему.
Ниже приведена моя самая простая попытка, которая может работать только для одного рабочего потока, и вызов Start для этого потока не приводит к вызову статического метода.Я установил точку останова в методе HelloWorld, и он никогда не срабатывает.
Я пробовал что-то очень похожее на это в консольном приложении, и оно работало так же, как и при вызове этого же потока в закомментированномлиния в начале AsyncHelloWorld.Есть ли что-то в потоке в процедурах SQL CLR, которое отличается?
using System.Threading;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[SqlProcedure]
public static void AsyncHelloWorld()
{
// HelloWorld(SqlContext.Pipe);
var worker = new Thread(HelloWorld);
worker.Start(SqlContext.Pipe);
worker.Join();
}
public static void HelloWorld(object o)
{
var pipe = o as SqlPipe;
if (pipe != null)
pipe.Send("Hello World!");
}
}