如何将矢量格式的图形从一个线程返回到另一个线程

本文关键字:线程 一个 返回 另一个 格式 图形 | 更新日期: 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参考