以不同的CPU优先级运行应用程序的各个部分

时间:2013-11-22 15:39:07

标签: c# cpu-speed

获得了winform C#应用程序。

它允许显示图像流(如视频)。

我还将这些jpeg 1上传到我的网络服务器,用户可以查看这些jpeg(如视频)。

为了使我的代码尽可能高效,我想知道我是否可以执行负责以不同优先级上传这些图像的代码部分 - 例如实时?

这可能吗?

如果是这样..

我是否必须将负责将这些图像上传到外部DLL的类对象移植? 那么我将如何在不同的流程优先级下“启动”它呢?

如果所有这一切都成为可能,并且如果我接受可能受到所有这些影响的PC上其他进程的可能折衷,它实际上会给我一个改进的性能吗?

由于

3 个答案:

答案 0 :(得分:2)

  

为了使我的代码尽可能高效

你正在考虑提前表现是件好事。即,根据它们的使用方式选择合适的数据结构和算法。

但是,您要避免的是过早的优化。并且线程/进程优先级肯定属于该类别。

  

我想知道我是否可以执行我的代码中负责以不同优先级上传这些图像的部分 - 例如实时?

     

...

     

这可能吗?

是的,但你不应该。

Windows操作系统已经拥有所谓的dynamic priority boost。这意味着已经的I / O绑定线程优先获得提升。

最好让操作系统处理优先级。

答案 1 :(得分:1)

虽然这种设计风格的好处值得怀疑,但实现这一点的一种方法是在应用程序中手动创建一个线程来运行您想要优先的代码,然后使用Thread.Priority设置线程优先级。属性。

另一种选择是在单独的进程中运行高优先级代码并更改进程级优先级。这可能比依赖线程优先级提供稍微好一点的性能,但会增加进一步的复杂性,因为现在您需要与应用程序的其余部分进行进程间通信的开销。

您可能希望阅读MSDN on Windows task scheduler priority system上的这篇文章。

答案 2 :(得分:1)

我认为线程优先级不会帮助您解决问题,但如果您希望是,您可以在C#中更改线程优先级,并且您还有许多帮助您控制线程工作流程的库,如

  • TPL,PLINQ
  • 任务
  • Async,Await
  • BackgroundWorker的
  • 线程等C#。

任务并行库的TPL在多处理器上非常强大。

在提升线程的优先级之前要仔细考虑 - 这可能会导致其他线程的资源不足等问题。

using (Process p = Process.GetCurrentProcess())
  p.PriorityClass = ProcessPriorityClass.High;

enum ThreadPriority { Lowest, BelowNormal, Normal, AboveNormal, Highest }

我建议您对图像使用编码/解码,这将有助于您将图像序列转换为视频。看看这个链接:

Rendering a Sequence of Images in C# to make a video