SQL CLR等待未执行

本文关键字:执行 等待 CLR SQL | 更新日期: 2023-09-27 18:09:11

这是我的理解,等待完成执行代码的其余部分时,他们从等待返回。我试图让这个工作在一个sql clr,这是不工作,因为等待的过程和下面的代码都没有得到执行。在调试方法中,控件只在执行await行后返回。

我怎样才能使这个工作,因为要求CLR在不阻塞主线程的情况下执行,以便其他工作可以在数据库中继续进行。我真的需要这个东西起作用,我已经用了两天了。

注如果方法是同步的,这种方法会很有效。存储过程集合在sql server中被注册为不安全。我正在使用mssql 2012和visual studio 2015。

public partial class StoredProcedures
{
   [Microsoft.SqlServer.Server.SqlProcedure]
   public static async void sp_push_stock_update(SqlString transactionPrimaryKey, SqlString transactionType)
   {
       using (SqlConnection conn = new SqlConnection("context connection=true"))
       {
           StockUpdateClient.stock_fetcher _stockFetcher = new StockUpdateClient.stock_fetcher(conn);
           List<String> skuList = await new 
           System.Threading.Tasks.Task<List<string>>(()=> 
           _stockFetcher.getItems(transactionPrimaryKey, transactionType));
           //Code does not get here
           performLogging(skuList):

        }
    }
}

SQL CLR等待未执行

要求在不阻塞主线程的情况下执行CLR

您是否尝试过不使用线程并体验过它确实阻塞了线程?你有可能把这个问题复杂化了。尽管如此,仍然有一些可用的选项:

  1. 按照本评论的建议用Thread.BeginThreadAffinity()Thread.EndThreadAfinity()包围可能长时间运行的呼叫。

  2. 通过创建一个新的Thread来处理长时间运行的调用,并等待它在调用thread.sleep(x);的循环中完成,以相当于"老式"的方式执行多线程:

    Thread _RunYouLongTime = new Thread(delegate);
    _RunYouLongTime.Start();
    while (_RunYouLongTime.IsAlive)
    {
      System.Threading.Thread.Sleep(100);
    }
    
  3. 如果长时间运行的调用是一个HttpRequest/Web Service,增加ServicePointManager。DefaultConnectionLimit财产。无论如何,或者即使你使用线程,都应该这样做!