.NET:tracelistener会运行在一个单独的低优先级线程上吗?

时间:2010-03-06 17:44:56

标签: .net

我是由内部开发的跟踪API提供的,它直接在调用者的同一个线程上写入数据库。我不喜欢这种方法。我认为是一个实现自定义数据库tracelistner,但想知道它是否会在一个单独的低优先级线程上运行,或者我自己管理线程。

1 个答案:

答案 0 :(得分:2)

首先,您不应该尝试设置线程的优先级。一般来说,这是一个坏主意,因为如果它感觉到那些线程被匮乏(在取消优先级线程的情况下)或占用线程,操作系统将覆盖线程优先级提升(或在这种情况下的延迟)太多时间(在高程的情况下)。

话虽如此,在.NET中,以异步方式进行数据库调用非常容易。例如,使用Begin *模式进行异步调用的SqlCommand class has a number of methods以及.NET中的大多数其他数据库提供程序都适用。

话虽这么说,如果你的跟踪API允许它,你应该使用这些机制之一来启动数据库操作,然后在你提供给异步机制的回调中完成。

如果您使用允许异步调用的提供程序,那么您应该使用ThreadPool class(特别是对QueueUserWorkItem的调用)对异步操作进行排队(这假设跟踪操作不是很长)。

如果您使用的是.NET 4.0,那么您甚至可能需要查看System.Threading.Tasks namespace中的类来执行类似ThreadPool的操作(有一个更好的API允许多个池,取消,以及ThreadPool没有的其他功能。

应该注意的是,在启动之前,您应该获得执行操作所需的所有相关信息。例如,您希望在进行异步调用之前获取操作的日期/时间,因为您希望该值反映您正在跟踪的操作,而不是跟踪本身。