SQL CLR等待不执行

我的理解是,当等待从等待返回时,等待完成执行代码的剩余部分。 我试图让它在sql clr中工作,并且这不能用作等待的进程和它下面的代码没有被执行。 在debug方法中,控件只在执行await行后返回。

我怎样才能完成这项工作,因为要求clr在不阻塞主线程的情况下执行,以便其他工作可以在db中继续运行。 我真的需要这个工作,现在已经有2天了。

NB如果方法是同步的,这很有效。 并且存储的proc程序集在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 skuList = await new System.Threading.Tasks.Task<List>(()=> _stockFetcher.getItems(transactionPrimaryKey, transactionType)); //Code does not get here performLogging(skuList): } } } 

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

您是否尝试过没有线程并且经历过它确实阻止了线程? 您可能会过度复杂化。 不过,有些选择是:

  1. 使用此注释中建议的Thread.BeginThreadAffinity()Thread.EndThreadAfinity()Thread.BeginThreadAffinity()可能长时间运行的调用。

  2. 通过创建一个处理长时间运行的调用的新Thread ,并等待它在一个调用thread.sleep(x);的循环中完成,以多种方式进行多Thread处理“老式”方式thread.sleep(x);

     Thread _RunYouLongTime = new Thread(delegate); _RunYouLongTime.Start(); while (_RunYouLongTime.IsAlive) { System.Threading.Thread.Sleep(100); } 
  3. 如果长时间运行的调用是HttpRequest / Web服务,请增加ServicePointManager.DefaultConnectionLimit属性。 无论您如何,甚至是否进行线程化,都应该这样做!