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):
}
}
}
要求在不阻塞主线程的情况下执行CLR
您是否尝试过不使用线程并体验过它确实阻塞了线程?你有可能把这个问题复杂化了。尽管如此,仍然有一些可用的选项:
-
按照本评论的建议用
Thread.BeginThreadAffinity()
和Thread.EndThreadAfinity()
包围可能长时间运行的呼叫。 -
通过创建一个新的
Thread
来处理长时间运行的调用,并等待它在调用thread.sleep(x);
的循环中完成,以相当于"老式"的方式执行多线程:Thread _RunYouLongTime = new Thread(delegate); _RunYouLongTime.Start(); while (_RunYouLongTime.IsAlive) { System.Threading.Thread.Sleep(100); }
-
如果长时间运行的调用是一个HttpRequest/Web Service,增加ServicePointManager。DefaultConnectionLimit财产。无论如何,或者即使你使用线程,都应该这样做!