我有一个流程来分析来自一个系统的审计数据,以构建另一个系统的报告数据.有一个管理程序循环每天进行分析,并在当前迭代日调用实体特定程序.有些实体需要不到一秒的时间来处理,而其他实体可能需要几分钟.像在t-sql中一样串行运行,16核服务器上的cpu利用率从未达到8%以上.每个实体特定程序不依赖于其他程序,只是当天的所有实体在第二天开始之前完成.
我的想法是拥有一个CLR管理程序,并在他们自己的线程上运行当天运行时间较长的程序,然后一旦快速完成,Thread.Join()长时间运行的线程等待所有实体完成前一天继续下一个.
下面是我的尝试作为最简单的事情,只适用于一个工作线程,并在该线程上调用Start不会导致调用静态方法.我在HelloWorld方法中设置了一个断点,它永远不会被击中.
我在控制台应用程序中尝试过非常类似的东西,并且它在AsyncHelloWorld开头的注释行中的同一线程上调用它.SQL CLR过程中的线程有什么不同吗?
using System.Threading;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[SqlProcedure]
public static void AsyncHelloWorld()
{
// HelloWorld(SqlContext.Pipe);
var worker = new Thread(HelloWorld);
worker.Start(SqlContext.Pipe);
worker.Join();
}
public static void HelloWorld(object o)
{
var pipe = o as SqlPipe;
if (pipe != null)
pipe.Send("Hello World!");
}
}
Run Code Online (Sandbox Code Playgroud)