J'ai un processus qui analyse les données d'audit d'un système pour créer des données de rapport pour un autre système. Il y a une procédure de gestion qui boucle pour chaque jour à analyser et appelle une procédure spécifique à l'entité avec le jour de l'itération en cours. Certaines entités prennent moins d'une seconde à traiter tandis que d'autres peuvent prendre quelques minutes. Fonctionnant en série comme dans t-sql, l'utilisation du processeur n'atteint jamais plus de 8% sur le serveur 16-core. Chacune des procédures spécifiques à l'entité ne dépend pas des autres, mais toutes les entités de cette journée sont complètes avant le jour suivant.Comment exécuter des sous-tâches dans un SQL Procédure en parallèle
Mon idée est d'avoir une procédure de gestion CLR et de commencer les procédures plus longues pour la journée qui tourne sur leurs propres threads, puis une fois que les rapides sont terminés, Thread.Join() les longs threads en attente de toutes les entités compléter pour ce jour avant de passer à la suivante. Ci-dessous est mon essai comme la chose la plus simple qui pourrait fonctionner pour un seul thread de travail, et l'appel de Start sur ce thread ne provoque pas l'appel de la méthode statique. J'ai mis un point d'arrêt dans la méthode HelloWorld et il n'est jamais touché.
J'ai essayé quelque chose de très similaire à cela dans une application console et je l'ai fait fonctionner comme si je l'appelais sur le même thread dans la ligne commentée au début de AsyncHelloWorld. Y a-t-il quelque chose à propos du threading dans les procédures SQL CLR qui est différent?
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!");
}
}
Avez-vous une erreur ou rien ne se passe? – Nate
La méthode HelloWorld n'est jamais appelée. –