0

SQL Anywhere のトリガーから URL をトリガーしようとしていますが、応答を待ちません。

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が「ティアダウン」されるのは正しいですか?

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

4

1 に答える 1

1

Call を SQL Anywhere イベントにラップできます。

テーブルトリガーで使用できますtrigger event <MyEvent>

トリガーは、独自の接続内で実行されます。トランザクションが多い場合、接続が不足したり、サーバーが過負荷になったりする可能性があります。気をつけて!

于 2012-07-14T08:24:49.313 に答える