在 Windows 服务中从 WPF 控件生成 PNG
Generating a PNG from WPF Control in a Windows Service
由于一项相当奇怪的任务,我想知道是否可以创建一个 Windows 服务,每隔 x 秒我们可以创建一个 System.Windows.Control 的 PNG 并将其写入磁盘。
目前,这个过程是通过每个用户的 WPF 应用程序处理的。流程没问题,但是渲染很慢(控件又大又复杂),每次都需要生成几个不同的版本。考虑到这一点,我开始怀疑这是否可以在服务器端处理。
例如,假设我们有一个包含以下文件的目录:
- 测试1.txt
- 测试2.txt
- 测试3.txt
每隔 5 秒,我想获取每个文件的名称,生成一个以文件名作为内容的控件,并呈现为 PNG。
我目前的尝试:
- 使用计时器的服务:失败 "The calling thread must be STA" 即使 [STAThread] 随处可见
- DispatcherTimer:从不滴答,因为没有 UI 线程导致它滴答
- 使用 Timer 和 Application.Current.Dispatcher.Invoke 的服务:将崩溃,因为调用中有一个或两个空对象。
有谁知道这是否可能?
我不确定您是否可以从服务创建新的 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' 中的代码,它甚至可以使用服务。
由于一项相当奇怪的任务,我想知道是否可以创建一个 Windows 服务,每隔 x 秒我们可以创建一个 System.Windows.Control 的 PNG 并将其写入磁盘。
目前,这个过程是通过每个用户的 WPF 应用程序处理的。流程没问题,但是渲染很慢(控件又大又复杂),每次都需要生成几个不同的版本。考虑到这一点,我开始怀疑这是否可以在服务器端处理。
例如,假设我们有一个包含以下文件的目录:
- 测试1.txt
- 测试2.txt
- 测试3.txt
每隔 5 秒,我想获取每个文件的名称,生成一个以文件名作为内容的控件,并呈现为 PNG。
我目前的尝试:
- 使用计时器的服务:失败 "The calling thread must be STA" 即使 [STAThread] 随处可见
- DispatcherTimer:从不滴答,因为没有 UI 线程导致它滴答
- 使用 Timer 和 Application.Current.Dispatcher.Invoke 的服务:将崩溃,因为调用中有一个或两个空对象。
有谁知道这是否可能?
我不确定您是否可以从服务创建新的 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' 中的代码,它甚至可以使用服务。