簡體   English   中英

SQL CLR等待未執行

[英]SQL CLR awaitable not getting executed

據我了解,當等待代碼從等待返回時,等待代碼將完成執行代碼的其余部分。 我試圖使它在sql clr中工作,但由於正在等待的進程及其下的代碼均未執行,因此該命令不起作用。 在debug方法中,控件僅在執行await行之后返回。

我怎么做這項工作,因為要求在不阻塞主線程的情況下執行clr,以便其他工作可以在db中繼續進行。 我真的需要它來工作,並且已經使用了2天了。

注意:如果方法是同步的,這很好用。 並且存儲的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<String> skuList = await new 
           System.Threading.Tasks.Task<List<string>>(()=> 
           _stockFetcher.getItems(transactionPrimaryKey, transactionType));

           //Code does not get here
           performLogging(skuList):


        }

    }
}

要求在不阻塞主線程的情況下執行clr

您是否嘗試過不使用線程並體驗到它確實阻塞了線程? 這可能會使您過於復雜。 仍然有一些可用的選項:

  1. 按照此注釋中的建議,用Thread.BeginThreadAffinity()Thread.EndThreadAfinity()包圍可能長時間運行的調用。

  2. 通過創建一個處理長時間運行的Thread的新Thread來進行多線程處理,這相當於“老式”方式,並等待它在調用thread.sleep(x);的循環中完成thread.sleep(x);

     Thread _RunYouLongTime = new Thread(delegate); _RunYouLongTime.Start(); while (_RunYouLongTime.IsAlive) { System.Threading.Thread.Sleep(100); } 
  3. 如果長時間運行的調用是HttpRequest / Web Service,請增加ServicePointManager.DefaultConnectionLimit屬性。 無論您如何進行線程操作,甚至即使執行線程操作,都應該這樣做!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM