如何将矢量格式的图形从一个线程返回到另一个线程
本文关键字:线程 一个 返回 另一个 格式 图形 | 更新日期: 2023-09-27 18:12:07
我正在设计一个系统,其中有多个并行运行的任务。它们中的每一个都得到一些输入,并且应该以矢量格式返回图形输出。
然后,主WPF应用程序应该根据用户请求绘制这些任务中任何一个的结果。目前我使用Canvas、Rectangle和其他System.Windows.Shapes作为我的图形矢量格式作为输出。任务完成后,我将Canvas子项逐个添加到GUI实际的Canvas中。
然而,我刚刚发现,除了主线程(所谓的Dispatcher线程(之外,不能在任何其他线程上创建UI元素。http://social.msdn.microsoft.com/Forums/ar/wpf/thread/c4600372-342c-4ee4-b49c-d9abf967fc93
将UI元素的创建(如上面文章中所建议的(委托给主线程对我来说不是一个选项,因为它们应该在用户要求输出时显示,而不是在任务完成时显示。
实际上,我不需要在另一个线程中创建UI元素,我只需要一种方便的方法来创建矢量图形,并在稍后的WPF应用程序中显示它们。
有人知道该怎么办吗?
在启动并行活动之前捕获UI(主线程(的SynchronizationContext
。并在捕获的SynchronizationContext
引用上调用(无论何时需要(Send
方法,以便将消息推送到UI线程中。MSDN上的SynchronizationContext
public partial class MainWindow : Window
{
SynchronizationContext UISyncContext;
YourTaskOutPut Myresult;
public MainWindow()
{
InitializeComponent();
}
public StartProcessingVGraphics()
{
//Let say this method is been called from UI thread. i.e on a button click
//capture the current synchronization context
UISyncContext=TaskScheduler.FromCurrentSynchronizationContext;
//Start your VGraph processing using TPL in background and store result to Myresult (of type YourTaskOutPut)
result= GetMeTaskResults();
}
public GetMeResultNow()
{
//Let's say this is is the method which user triggers at
//some point in time ( with the assumption that we have Myresult in hand)
if(UISyncContext!=null)
UISyncContext.Send(new SendOrPostCallback(delegate{ PutItInUI }),null);
//Use Send method - to send your request synchronously
//Use Post method- to send your request asynchronously
}
void PutItInUI()
{
//this method help you to put your result in UI/controls
}
我找到了另一个可能的答案。当图形不是绘制的而是定义的时,应该使用GeometryDrawing类而不是Shapes,就像我的情况一样。它有Freeze方法,允许通过不同的线程传递它,因为它是不可变的。摘自Microsoft MSDN:
System.Windows.Shapes.Shape类具有Fill、Stroke和其他呈现属性,而Geometry及其派生类缺少这些属性。Shape类是FrameworkElement,因此参与布局系统;其派生类可以用作任何支持UIElement子元素的元素的内容。
另一方面,"几何体"类仅定义形状的几何体,而不能渲染自身。由于它的简单性,它有更广泛的用途。
MSDN参考