.net - 在另一个线程中使用 WPF 多边形

标签 .net wpf vb.net multithreading backgroundworker

我在将类型为 Dictionary(Of Int16, Polygon) 的对象作为参数传递给后台工作人员时遇到问题,以便后台工作人员能够访问字典中的多边形。我收到典型的“调用线程无法访问此对象,因为另一个线程拥有它”消息。这是我所拥有的:

                Dim worker As New BackgroundWorker
                AddHandler worker.DoWork, AddressOf MeasurePolygons
                AddHandler worker.RunWorkerCompleted, AddressOf WorkerCompleted

                worker.RunWorkerAsync(PolygonCollection)

PolygonCollection 是在类顶部声明的私有(private)变量,类型为 Dictionary(Of Int16, Polygon)。它将包含 1-10 个多边形,我想将此集合传递给后台工作人员,因为我对字典中的每个多边形进行计算。

    Dim TempPolygonCollection As Dictionary(Of Int16, Polygon)
    TempPolygonCollection = CType(e.Argument, Dictionary(Of Int16, Polygon))
    For i = 0 To TempPolygonCollection.Count - 1
            If TempPolygonCollection.ContainsKey(CShort(i)) Then
                Dim rtb As New RenderTargetBitmap(CInt(800), CInt(600), 96D, 96D, PixelFormats.Default)
                rtb.Render(TempPolygonCollection.Item(CShort(i)))
                Dim encoder As New BmpBitmapEncoder
                encoder.Frames.Add(BitmapFrame.Create(rtb))
            End If
    Next i

错误发生在 rtb.Render(TempPolygonCollection.Item(CShort(i))) 上。任何帮助将非常感激。谢谢。

编辑: 因此,这 2 位友好的海报帮助我缩小了问题范围,但我仍然不知道如何解决这个问题。

当前问题:我有一个类型为 Dictionary(Of Int16, Polygon) 的对象。我需要能够使用 BackgroundWorker 访问此 Dictionary 中在 UI 线程上创建的每个单独的多边形。然后在 backgroundworker 上,我将基于字典中的多边形创建一个位图文件。那么我怎样才能访问 backgroundworker 上的多边形呢?感谢您的帮助。

最佳答案

问题不在于Dictionary,问题在于存储在Dictionary 中的Polygon。这些是在 UI 线程中创建的 WPF UI 元素,因此只有 UI 线程可以使用它们。

您可以在 UI 线程中执行 Render 操作(使用 Dispatcher.Invoke)。这意味着渲染会阻塞您的 UI 线程,但至少 渲染操作之间,UI 线程将能够处理其他事情,即,如果需要时间,UI 应该保持响应单个渲染操作不会太长。

关于.net - 在另一个线程中使用 WPF 多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4226977/

相关文章:

c# - 如何将带有 contextMenu 的 WPF ListView 绑定(bind)到 viewModel

c# - 以编程方式设置 WPF 元素的名称属性

.net - 通常最好使用 StringComparison.OrdinalIgnoreCase 或 StringComparison.InvariantCultureIgnoreCase?

VB.NET XML Literals 与 StringBuilder 在性能方面的对比

c# - Wpf UserControl 宽度和高度不 Taknig

c# - GAC 中没有 MySql.Data 的 Fluent NHibernate 连接到 MySql

wpf - 禁用切换按钮选择颜色

.net - 与默认的托管二进制分析规则集相比,使用 Microsoft.CodeAnalysis.FxCopAnalyzers nuget 有什么优势?

c# - 连接两个列表中的字符串以创建第三个列表

mysql - VB.NET 数据集不清除