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

如何调用具有某种优先级的异步方法?

  •  0
  • Nick  · 技术社区  · 15 年前

    我需要以不同的优先级异步调用两个方法。

    我的第一个想法是使用线程池并更改线程的优先级,如下所示:

    static void Run()
    {
      ThreadPool.QueueUserWorkItem(new WaitCallback(SomeMethod));
    }
    
    static void SomeMethod(object o)
    {
      Thread.CurrentThread.Priority = ThreadPriority.BelowNormal; // is this ok?
      // do some work here
    }
    

    这样行吗?你有什么建议吗?

    4 回复  |  直到 15 年前
        1
  •  4
  •   Community Bora    4 年前

    根据 http://msdn.microsoft.com/en-us/library/0ka9477y.aspx

    有几种情况适合创建和管理自己的线程,而不是使用线程池线程:

    • 你需要一个前台线程。

    • 您需要一个线程具有特定的优先级。

    • 您的任务会导致线程长时间阻塞。线程池具有最大数量的线程,因此大量阻塞的线程池线程可能会阻止任务启动。

    • 您需要将线程放置到单线程单元中。所有线程池线程都在多线程单元中。

    • 您需要有一个与线程关联的稳定标识,或者将一个线程专用于一个任务。

    您可能需要提出自己的实现,并直接处理线程的创建。

    问题:

        2
  •  2
  •   casperOne    15 年前

    那是 A. 极坏的

    一般来说,设置线程或进程优先级是一个坏主意,因为它是不确定的,并且可能会耗尽其他线程/进程。此外,您实际上可能会因为饥饿而提高低优先级线程/进程的优先级。

    最重要的是,线程池的线程意味着可以重用,通过更改线程的优先级,您可以更改在例程运行后获得线程以供使用的任务的期望。

    如果您只希望线程运行您的任务,那么您必须创建自己的线程池(使用System.thread类),然后执行相同的操作,使用包装器代码根据优先级执行任务。

    NET 4.0中System.Threading命名空间中的新类(尚未发布)将为您处理单独线程池的创建。

        3
  •  0
  •   Antti Huima    15 年前

    我认为,为了保持干净,当您退出该方法时,还应该恢复线程优先级!(使用try…finally或类似用法)