4

有一个 winform C# 应用程序。

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

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

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

这可能吗?

如果是这样..

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

如果这一切都是可能的,并且如果我接受我的 PC 上可能受这一切影响的其他进程的可能权衡,它实际上会给我带来改进的性能吗?

谢谢

4

3 回答 3

2

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

预先考虑性能是件好事。即,根据使用方式选择适当的数据结构和算法。

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

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

...

这可能吗?

是的,但你不应该。

Windows 操作系统已经有了所谓的动态优先级提升。这意味着 I/O-bound 线程的优先级已经得到提升。

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

于 2013-11-22T16:01:40.363 回答
1

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

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

您可能想阅读MSDN 上有关 Windows 任务调度程序优先级系统的这篇文章。

于 2013-11-22T15:42:12.537 回答
1

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

  • TPL、PLINQ
  • 任务
  • 异步,等待
  • 后台工作者
  • 线程等 C#。

TPL for Task Parallel Library 在多处理器上非常强大。

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

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

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

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

在 C# 中渲染图像序列以制作视频

于 2013-11-22T15:49:54.730 回答