2012-03-07 3 views
0

J'essaie de déclencher une URL à partir d'un déclencheur dans SQL Anywhere et de ne pas attendre la réponse.Démarrer un thread à partir de CLR lorsqu'il est appelé à partir de SQL Anywhere?

Dans SQL Anywhere I ont la fonction suivante:

CREATE FUNCTION "DBA"."sendCallback"(in @serverip text,in @url text) 
returns char(255) 
not deterministic 
external name 'Callback.dll::Namspace.Callback.OpenUrlAsync(string, string) string' language CLR 

Et en C# J'ai le programme suivant:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Net; 
using System.ComponentModel; 

namespace Namspace 
{ 
    public static class Callback 
    { 

     public static string OpenUrlAsync(string server, string url) 
     { 
      try 
      { 
       Thread t1 = new System.Threading.Thread 
        (() => 
        { 
         using (WebClient wc = new WebClient()) 
         { 
          try 
          { 
           string result = wc.DownloadString(server + url); 
          } 
          catch (Exception ee) 
          { 
           Console.Error.WriteLine(ee.Message); 
          } 
         } 
        }); 
       t1.Start(); 

      } 
      catch (Exception e) 
      { 
       Console.Error.WriteLine(e.Message); 
      } 

      return "done"; 
     } 

    } 
} 

Quand j'appelle cela de ISQL cela fonctionne parfaitement, mais quand il est appelé à partir du déclencheur, il loks comme la bande de roulement est avorté avant de pouvoir faire l'appel.

Si j'ajoute t1.Join() après avoir démarré, j'obtiens l'effet désiré, mais il faut beaucoup de temps pour être appelé depuis un déclencheur.

Est-il correct que le CLR soit "abattu" lorsque la connexion appelant est terminée?

Comment puis-je m'assurer que le filetage est terminé?

Répondre

1

Vous pouvez placer l'appel dans un événement SQL Anywhere.

Dans votre tableau Trigger vous pouvez utiliser trigger event <MyEvent>

triggers sont exécutés dans sa propre connexion. Si vous avez beaucoup de transactions, vous pouvez manquer de connexions ou surcharger le serveur. Fais attention!

Questions connexes