在 Windows 服务中从 WPF 控件生成 PNG

Generating a PNG from WPF Control in a Windows Service

由于一项相当奇怪的任务,我想知道是否可以创建一个 Windows 服务,每隔 x 秒我们可以创建一个 System.Windows.Control 的 PNG 并将其写入磁盘。

目前,这个过程是通过每个用户的 WPF 应用程序处理的。流程没问题,但是渲染很慢(控件又大又复杂),每次都需要生成几个不同的版本。考虑到这一点,我开始怀疑这是否可以在服务器端处理。

例如,假设我们有一个包含以下文件的目录:

每隔 5 秒,我想获取每个文件的名称,生成一个以文件名作为内容的控件,并呈现为 PNG。

我目前的尝试:

有谁知道这是否可能?

我不确定您是否可以从服务创建新的 Windows。但我可以解决你的计时器问题。

如果要创建这些计时器之一,通常需要在 STAT-Thread.Why is STAThread required?

中执行
Thread timer = new Thread(() =>
{
    while (true)
    {
        //do stuff...

        Thread.Sleep(5000); //wait 5 seconds
    }
 });
 timer.SetApartmentState(ApartmentState.STA); //creates a new Thread for UIs
 timer.IsBackground = true; //if you main Thread exits this will also shutdown.
 timer.Start();

如果您不想使用 Lambda

private void MyTimerMethode()
{
    while (true)
    {
        // do stuff...

        Thread.Sleep(5000); //wait 5 seconds
    }
}


    Thread timer = new Thread(MyTimerMethode);
    timer.SetApartmentState(ApartmentState.STA); //creates a new Thread for UIs
    timer.IsBackground = true;
    timer.Start();

如果你想杀死它你可以使用

timer.Abort();

但我建议使用 bool isAlive = true; 之类的字段并将其用作 while 循环条件。现在如果你想结束它,你可以在不杀死它和抛出任何异常的情况下结束它。

这是我在快速 google 搜索将控件渲染为图像后发现的。 如何在不创建 window 的情况下将 WPF UserControl 呈现为位图

编辑: 我已经尝试使用 'How to render a WPF UserControl to a bitmap without creating a window' 中的代码,它甚至可以使用服务。