2012-03-07 1 views
0

Я пытаюсь вызвать URL-адрес из триггера в SQL Anywhere и не дожидаться ответа.Запустить поток из CLR при вызове из SQL Anywhere?

В SQL Anywhere У меня есть следующие функции:

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 

И в C# У меня есть следующие программы:

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"; 
     } 

    } 
} 

Когда я называю это из ISQL он отлично работает, но когда это вызываемый из триггера, он простаивает, как протекторы прерываются, прежде чем он сможет позвонить.

Если я добавлю t1.Join() после его запуска, я получаю желаемый эффект, но затем он использует много времени для вызова из триггера.

Правильно ли, что CLR получает «проветривание» при завершении соединения?

Как я могу убедиться, что нить заканчивается?

ответ

1

Вы можете обернуть вызов в событии SQL Anywhere.

В вашей таблице Trigger вы можете использовать trigger event <MyEvent>

триггеры выполняются в пределах своей собственной связи. Если у вас много транзакций, у вас может закончиться соединение или перегрузка сервера. Будь осторожен!

Смежные вопросы