2012-03-07 1 views
0

私はSQL AnywhereでトリガからURLをトリガしようとしていますが、レスポンスを待っていません。 SQLでSQL Anywhereから呼び出されたときにCLRからスレッドを開始しますか?

どこでも私は、次の機能があります。

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からこれを呼び出すと、それは完璧に動作しますが、それがあるときにそれは呼び出しを行うことができます前にトレッドのようなloksトリガーから呼び出されます。

起動した後にt1.Join()を追加すると、目的の効果が得られますが、トリガーから呼び出すまでに多くの時間がかかります。

それを呼び出す接続が終了したときにCLRが "teared down"になるのは正しいですか?

スレッドの終了を確認するにはどうすればよいですか?

答えて

1

SQL Anywhereイベントで呼び出しをラップすることができます。あなたの表のトリガーで

あなたはその後、trigger event <MyEvent>

トリガーは独自の接続内で実行されている使用することができます。トランザクションが多い場合は、接続が不足したり、サーバーが過負荷になったりする可能性があります。注意してください!

関連する問題