代码之家  ›  专栏  ›  技术社区  ›  funwithcoding

.NET:TraceListener将在单独的低优先级线程上运行吗?

  •  0
  • funwithcoding  · 技术社区  · 14 年前

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

    1 回复  |  直到 14 年前
        1
  •  2
  •   casperOne    14 年前

    首先,不应该尝试设置线程的优先级。一般来说,这是一个坏主意,因为线程优先级提升(在这种情况下是解除提升)将被操作系统覆盖,以防这些线程被耗尽(在解除线程优先级的情况下)或占用太多时间(在提升的情况下)。

    也就是说,在.net中,很容易在一个小时内进行数据库调用。例如, SqlCommand class has a number of methods 在异步调用中使用begin*模式,而.net中的大多数其他数据库提供程序都遵循这种模式。

    也就是说,如果跟踪api允许,那么应该使用这些机制之一启动数据库操作,然后在提供给异步机制的回调中完成。

    如果你是 使用允许异步调用的提供程序,则可能应该使用 ThreadPool class (特别是 QueueUserWorkItem )将异步操作排队(这假定跟踪操作不是lenghty)。

    如果您使用的是.net 4.0,那么您甚至可以查看 System.Threading.Tasks namespace 执行类似线程池的操作(有一个更好的api,它允许多个池、取消和线程池没有的其他特性)。

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