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

您可以将调用包装在 SQL Anywhere 事件中。

在您的表触发器中,您可以使用trigger event <MyEvent>

触发器在其自己的连接中执行。如果您有很多事务,您可能会用完连接或使服务器过载。小心点!

于 2012-07-14T08:24:49.313 回答