如何在 WPF 中使用线程的结果?

2024-01-24

不幸的是,线程和任务对我来说是一个很大的谜。

必须在与 DependencyObject 相同的线程上创建 DependencySource。

我正在努力避免用户界面冻结。我的方法是在线程中完成工作,然后使用线程的输出设置属性。
我有一个基类Job。基本上它是一个包装器,用一个开始一个新线程Input and Output多变的。我启动一个新线程,等到工作完成并尝试将其设置为我的属性MyFoo。但这是行不通的。请参阅上面引用的错误消息。


How can I use a thread* without blocking the UI and set the result to an property in WPF?
* I actually don't care if it is a thread, a task or whatever as long as it is not blocking my UI.

        // ...
        FooJob job = new FooJob {Input = input};
        job.Start();
        while (!job.IsDone) Wait(0.05);
        MyFoo = (BitmapSource) job.Output;


我尝试的是将输出设置为我的字段而不是我的属性并调用属性改变时手动。


这里是实际的包装类

public class Job {
    public object Output;
    public object Input;

    private bool _isDone;
    private readonly object _handle = new object();
    private Thread _thread;

    public bool IsDone {
        get {
            bool tmp;
            lock (_handle) {
                tmp = _isDone;
            }
            return tmp;
        }
        set {
            lock (_handle) {
                _isDone = value;
            }
        }
    }

    public virtual void Start() {
        _thread = new Thread(Run);
        _thread.Start();
    }

    protected virtual void ThreadFunction() {}

    private void Run() {
        ThreadFunction();
        IsDone = true;
    }
}

您收到异常的原因必须在与 DependencyObject 相同的线程上创建 DependencySource。是一个迹象表明BitmapSource已在新线程上创建,您将无法绑定BitmapSource到 UI,除非您在 UI 线程上创建它。然而,因为BitmapSource是可冻结的,您也可以“冻结”它以删除它的线程关联性。所以如果你真的需要创建一个BitmapSource在另一个线程上你将不得不调用Freeze on the BitmapSource在您可以将其绑定到 UI 之前。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 WPF 中使用线程的结果? 的相关文章

  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • 在 Django 模型中使用 Trigram (gin_trgm_ops) 创建 Gin 索引

    django contrib postgres 的新 TrigramSimilarity 功能非常适合解决我遇到的问题 我用它作为搜索栏来查找难以拼写的拉丁名字 问题是名字超过 200 万个 搜索时间比我想要的要长 我想在三元组上创建一个索
  • Pandas:检查列值是否小于任何先前的列值

    我想检查 c 列的任何值是否小于所有先前的列值 在我当前的方法中 我使用 pandas diff 但它只让我与以前的值进行比较 import pandas as pd df pd DataFrame c 1 4 9 7 8 36 df di
  • REST 中的资源和资源表示有什么区别?

    我是 REST 新手 刚刚开始阅读一些教程 真正让我困惑的一件事是 txt xml json 形式的内容是什么 资源还是资源表示形式 一定是后者吧 由于资源可以是视频 音频或其他 MIME 类型 以下面的例子为例 假设我得到的描述类似于 R
  • 长时间等待向 Service Worker 发出请求

    我注意到 等待服务工作人员响应缓存中的项目的时间并不像您预期 的那么快 我发现两者的等待时间相同sw precache和一个定制的书面服务人员 造成此等待时间的可能原因是什么 如何减少它 My fetch自定义 Service Worker
  • ggplot错误的颜色分配

    颜色到十六进制值的分配是错误的 我不明白为什么 在将十六进制颜色添加到数据框之前我对它们进行了排序data然后在 ggplot2 函数中使用 我以为这样就能解决问题 但事实并非如此 我还创建了向量col其中包含十六进制以及 rgb 颜色值
  • Mod_Rewrite 不适用于 codeigniter 站点

    我为我的 codeigniter 站点尝试了 modrewrite 但是当我进入 htaccess 文件时 已经有一个了 RewriteEngine on RewriteCond 1 index php combine php images
  • Swift Scenekit - 居中 SCNText - getBoundingBoxMin:Max 问题

    享受 SCNText 上的alignmentMode 选项带来的乐趣 谷歌搜索了一下 看起来alignmentMode和containerFrame有问题 我发现的替代方案建议使用获取边界框功能来查找文本大小 然后手动进行相应调整 很好 除
  • W3C 验证器显示“提要未验证”“url 必须是完整的 URL”...有什么问题吗?

    正在验证我的提要 它的附件的 URL 为 https archive org download NigelFarageAPersonalMessageToNorthernIrelandVoters Nigel 20Farage 20a 20
  • 当复选框被选中时如何调用javascript函数

    当复选框位于 gridview 内时 如何调用 Javascript 函数 protected void AlteraStatusExpiraSeteDias Click object sender EventArgs e for int
  • 从 Rails 2.3.6 开始不推荐使用 overwrite_params —— 接受的解决方法吗?

    所以 看起来像overwrite params从 Rails 2 3 6 开始已弃用 是否存在被普遍接受为最佳实践的合适解决方法 例如 我曾经能够执行以下操作 我认为这非常有用 url for overwrite params gt pag
  • 散列范围

    我有一个范围元素数组 每个元素都有一个开始和一个结束 在数组内 范围不重叠 并且已排序 即 代码只是为了说明 不要指望它能够编译 var arr 0 3 5 10 15 59 给定一个值 比如 9 是否有范围的哈希函数可以让我快速获取包含该
  • Java构建时间常数配置

    我有一个项目想使用多种配置来构建 我有一个常量需要在构建之间有所不同 但我不知道如何根据我的配置更改它 例如 我希望能够根据配置文件中的值执行以下操作 WebService targetNamespace http example com
  • 在 PHP 中获取浮点数的小数部分的最佳方法是什么?

    在 PHP 中如何找到浮点数的小数部分 例如 如果我有值1 25 我想回来0 25 x x floor x
  • C:表示不带浮点数的分数

    我正在为没有硬件浮点支持的嵌入式系统 MSP430 编写一些代码 不幸的是 当我进行测距时 我需要在代码中使用分数 而精度为 1m 的短程传感器并不是一个很好的传感器 我可以用整数进行尽可能多的数学运算 但到最后 我肯定需要对两个值进行分数
  • 使用 iOS 模块构建 Native View 并在 Titanium 中使用它们

    我想构建一个 iOS 模块 其中有一个 viewController 类及其 xib 文件 现在的问题是如何从我的钛代码中调用该视图 我知道有可用的视图代理 但由于文档不太好 不知道如何使用它们 到目前为止 我已经创建了一个可以传递非图形数
  • 如何从 PHP 中的日期时间戳获取时间和日期?

    我有一根像8 29 2011 11 16 12 AM 我想保存在变量中 例如 dat 8 29 2011 and tme 11 16 12 AM 如何实现这一目标 你能举个例子吗 E g
  • 无法向 Google 电子表格添加行

    我可以打开工作表并从标题中读取单元格 Google 电子表格中的第一行是标题 我已在 Google 电子表格中手动添加了 Name my val1 my val2 my val3 Other 这是相关的谷歌文档 https develope
  • 从 git svn clone 中排除文件

    我正在将 SVN 存储库迁移到 Git 并且我有 7000 多个二进制文件 我希望从一开始就将它们排除在导入之外并成为 Git 历史记录的一部分 而不是在之后清理它们 参考此question https stackoverflow com
  • 如何将元组的元组转换为其元素的计数?

    我有这个tuple元组 TupleOfTuples Venue1 Name1 Venue1 Name2 Venue2 Name3 Venue3 Name4 Venue3 Name5 Venue3 Name6 我想将其转换以获得如下结果 Ou
  • 如何在 WPF 中使用线程的结果?

    不幸的是 线程和任务对我来说是一个很大的谜 必须在与 DependencyObject 相同的线程上创建 DependencySource 我正在努力避免用户界面冻结 我的方法是在线程中完成工作 然后使用线程的输出设置属性 我有一个基类Jo