TaskFactory 新 UI 创建

2024-01-04

如何使用 TaskFactory 创建新的 UI 元素?当我尝试时出现以下错误:

调用线程必须是 STA,因为许多 UI 组件都需要它。

示例代码

Dim txtBoxList as new List(Of TextBox)

Sub StartThread()
    Dim TS As TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext()
    Task.Factory.StartNew(Sub() CreateControl(), TS)
End Sub

Sub CreateControl()
    Dim txtBox As New TextBox
    Dispatcher.BeginInvoke(Sub() txtBoxList.Add(txtBox))
End Sub

如果您正在使用 WPF,您确实需要抛弃您可能从古代技术中学到的所有概念,并理解和接受WPF 心态 https://stackoverflow.com/a/15684569/643085.

基本上,你几乎never需要在 WPF 中的过程代码中创建或操作 UI 元素。相反,WPF 适合大量使用数据绑定 http://msdn.microsoft.com/en-us/library/ms752347(v=vs.110).aspx.

WPF 线程模型 http://msdn.microsoft.com/en-us/library/ms741870(v=vs.110).aspx does not允许您在后台线程中创建或操作 UI 元素的实例,并将它们添加到视觉树 http://msdn.microsoft.com/en-us/library/ms753391(v=vs.110).aspx它是由“主”UI 线程创建的。

无论如何,对这样的事情的需求几乎为零,因为在大多数情况下创建 UI 元素是一项可以(并且必须)由 UI 线程执行的微不足道的任务。

而不是担心视觉树,你应该集中精力让你的Data加载到后台线程中,然后作为数据上下文 http://rachel53461.wordpress.com/2012/07/14/what-is-this-datacontext-you-speak-of/到 UI,以便它可以相应地显示您的数据。

这是一个小例子,使用ItemsControl http://drwpf.com/blog/itemscontrol-a-to-z/显示用户列表,该列表在后台线程中异步加载,然后分派到 UI 线程进行显示:

<Window x:Class="WpfApplication7.AsyncItemsControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ItemsControl ItemsSource="{Binding}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Border Background="LightGray" BorderBrush="Black" BorderThickness="1" Margin="2">
                    <StackPanel>
                        <TextBlock Text="{Binding LastName}" Margin="2"/>
                        <TextBlock Text="{Binding FirstName}" Margin="2"/>
                    </StackPanel>
                </Border>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Window>

背后代码:

public partial class AsyncItemsControl : Window
{
    public AsyncItemsControl()
    {
        InitializeComponent();

        var dispatcher = TaskScheduler.FromCurrentSynchronizationContext();

        Task.Factory.StartNew(() => GetUsers())
                    .ContinueWith(x => DataContext = x.Result,dispatcher);

    }

    public List<User> GetUsers()
    {
        // pretend this method calls a Web Service or Database to retrieve the data, and it takes 5 seconds to get a response:
        Thread.Sleep(5000);

        return new List<User>
        {
            new User() {FirstName = "Marty", LastName = "McFly"},
            new User() {FirstName = "Emmett", LastName = "Brown"},
            new User() {FirstName = "Bufford", LastName = "Tannen"}
        };
    }
}

数据项:

public class User
{
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

Result:

  • 请注意,该示例使用 DataBinding,并且它不会在过程代码中创建或操作 UI 元素,而是使用简单的操作User简单的类string特性。

  • 另请注意,在 5 秒“加载”时间内,UI 会做出响应,因为实际工作是由后台线程执行的。

  • 这种方法允许 UI 和数据之间更大的分离,从而允许 UI 具有更大的可扩展性和可定制性,而无需更改底层业务/应用程序逻辑。

  • 请注意如何ItemsControl负责创建和渲染显示 3 个数据项所需的适当 UI 元素。 “每件物品的外观”的实际定义是数据模板 http://msdn.microsoft.com/en-us/library/ms742521(v=vs.110).aspx.

  • 我强烈建议阅读本答案中链接的材料,以便更深入地了解 WPF 的总体工作原理。

  • 旁注:如果您的目标是 C# 5.0,您可以利用async / await并通过删除所有来使代码更干净Task为基础的东西。我使用的是 C# 4.0,因此该功能对我来说不可用。

  • WPF 摇滚。只需将我的代码复制并粘贴到File -> New Project -> WPF Application并亲自查看结果。

  • 如果您需要进一步的帮助,请告诉我。

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

TaskFactory 新 UI 创建 的相关文章

  • windows XP中如何设置默认编码?

    我尝试使用 StreamReader 打开文件并设置编码 但我希望它采用默认 Windows 编码 我如何更改我的 Windows 编码 区域和语言选项控制面板项目 高级选项卡 影响整个计算机
  • 使用 CoCreateInstance 从 C++ 调用 COMVisible VB.Net dll

    自从我上一个问题以来 在某种程度上取得了进展 我已经编译了以下项目 它是基于https stackoverflow com a 10949784 846550 https stackoverflow com a 10949784 84655
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • 如何将 WPF 3.0 下构建的应用程序转换为 4.5 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在 WPF 3 0 中构建了一个应
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • WPF Treeview,如何更改缩进

    我的树视图基本上有 文件夹 节点 以及不包含其他项目的项目下面的一层 因此 不需要用于展开 折叠图标的空间 在第 2 层 我可以放弃这个图标空间从而减少缩进吗 项目 在示例 机场 中 应向左移动一些像素 重要提示 基本上是寻找代码解决方案
  • 为什么在 Windows 中缩放 WPF 应用程序时会看到像素?

    我使用 WPF 为随机应用程序开发了一个 GUI 我在应用程序窗口上放置了一堆开箱即用的 WPF 控件 我没有定制任何东西 没有使用位图等 在 Windows 7 中运行我的应用程序并使用放大镜应用程序进行缩放时 Win key Plus
  • 使用 XAML 地图控件在基于 C# VS2013 WPF 的 OpenStreetMap 的地图上添加热图图层

    我正在尝试使用 XAML MAP 控件 https xamlmapcontrol codeplex com https xamlmapcontrol codeplex com 在基于 C VS2013 WPF 的 OpenStreetMap
  • 在 ViewModel 中使用 CollectionViewSource 的正确方法

    我使用拖放将数据源对象 数据库模型 绑定到DataGrid 基本上遵循这个例子实体框架与 WPF 的数据绑定 http msdn microsoft com en us data jj574514 通过这个实现 一切都运行良好 XAML
  • GridSplitter 从右侧调整大小 - 奇怪的行为

    使用 Kaxaml 从左侧调整大小可以按预期工作
  • 什么是WPF浏览器应用程序类型项目?

    什么时候应该使用 WPF 浏览器应用程序 该项目类型有什么用处 开发人员什么时候应该使用这个 WPF 浏览器应用程序是在浏览器中作为 XBAP Xaml 浏览器应用程序 运行的应用程序 您可以找到有关 XBAP 的用途和原因的更多信息her
  • 这段代码有什么问题。如果用户选择或不选择复选框,为什么它仍然显示 MsgBox? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 无论我是否选择复选框 它仍然会给出
  • 内容更新时自动调整列表视图列的大小

    我试图让列表视图中的 gridviewcolumns 在更新绑定源 视图模型上的可观察集合 时自动调整内容大小 列表视图填充正常 但当我刷新 更新集合时不起作用 这是我到目前为止正在尝试的解决方案 XAML
  • 将标签文本设置为 gridview 的总行数

    我使用 sql 数据库中的存储过程作为 aspx 页面上 SqlDataSourceControl 的数据源 然后 我使用 SqlDataSourceControl 作为页面上 gridview 的数据源 gridview 上的分页设置为
  • WPF DataGrid 选定项

    我有一个 DataGrid 用户可以通过在最后一行输入数据来添加项目 我还有一个按钮可以删除当前选定的项目 但是 当选择最后一行 空 用于添加新项目 时 最后选定的项目将保留在 SelectedItem 中 因此 如果我打开窗口 选择最后一
  • 密码盒和 MVVM

    我们有以下场景 MVVM 用户界面 用户可以在其中输入密码 实际上是一个PasswordBox 应该做一些工作的服务器 服务器连接到一些需要身份验证的数据库 我已经读过这个关于MVVM中PasswordBox的问题 https stacko
  • 多选DataGridView没有CTRL键没有闪烁?

    我在表单 Form1 vb 上有一个 DataGridView 控件 需要允许用户在不使用 CTRL 键的情况下多选行 没有可用的键盘 他们使用触摸屏 我已启用 mutliselect 属性 并在 Form 类中包含以下代码 我的 Data
  • GridViewColumn 中的 WPF 文本格式设置

    我想将格式 对齐文本 货币格式 0000 00 应用于 GridViewColumn 中的列
  • 尝试添加注册表项时出现未处理的异常

    当我使用以下代码时 My Computer Registry LocalMachine OpenSubKey SOFTWARE Microsoft Windows CurrentVersion Run True SetValue Appli

随机推荐

  • 如何在 PHP OOP 中连接控制器来查看?

    现在我使用 PHP OOP 编程 没有框架 我开始创建一个博客应用程序 首先 我创建一个 Bootstrap 文件 然后所有情况都应该通过它来处理 然后我创建一个处理程序类来处理登录和发布类 现在显示登录处理程序类中的值 然后如何连接到视图
  • 为什么 nuxt 中的“仅客户端”组件抱怨“窗口未定义”?

    我有 Vue SPA 我正在尝试迁移到 nuxt 我在用vue2leaflet在我包含的组件中
  • 使用上下文填充数据集 - Entity Framework 4

    我有一些从上下文返回的数据 数据已被拉取spCmsCategoriesReadHierarchy I need从上下文中获取所有数据并填充我的数据集 我的最终目标是用 DataSet 对象填充 TreeView 控件 有任何想法吗 感谢您的
  • 如何在 PHP 中验证 DKIM 签名?

    我承认我不太擅长密钥验证 我有一个从 POP3 服务器下载消息的脚本 并且我正在尝试验证 PHP 中的 DKIM 签名 我已经弄清楚了主体哈希 bh 验证检查 但我无法弄清楚标头验证 http www dkim org specs rfc4
  • Google Analytics - 跟踪单个 HTTP 请求中的多个事件

    我需要跟踪该项目在搜索结果 在网络应用程序中 中出现的次数 IE 用户搜索某些内容并获取前 20 个项目 跟踪第 20 个项目中每一个的 1 次访问 在另一个页面上 用户可以查看项目的统计信息 它在搜索结果中显示的次数 我考虑使用谷歌分析事
  • Vuejs:根据 eslint 规则对 html 数据进行 V-HTML 数据绑定

    我正在使用以下方法绑定 html 并显示在我的页面中 它工作完美 但是我收到来自 eslint 的警告 v html 指令可能导致 XSS 攻击 eslint vue no v html
  • LocalDB 和实体框架 6 - 安全性

    我正在尝试找出一种使用 LocalDB 代替 SQL 来进行 EF6 查询集成测试的方法 这将允许我们在构建服务器上运行集成测试 看来我应该能够在 SQL Express 中复制我的数据库 分离并导入到我的测试项目中 我希望从那里我可以修改
  • R:解析嵌套括号

    我想使用 R 解析嵌套括号 不 这不是 JASON 我见过使用 perl php 和 python 的示例 但我在 R 中无法正常工作 以下是一些数据的示例 a a a aa a a a a b b b b cc c c 我想根据三个父括号
  • 在 docker 容器内运行 pudb

    我更喜欢使用 pudb 进行 python 调试 我正在构建在 docker 容器内运行的 python 应用程序 有谁知道如何使 pudb 在 docker 容器内可用 谢谢 您需要在 Docker 容器上安装 pudb 可以通过将此行添
  • 使用 jquery 将项目添加到列表框

    如何使用 jquery 将项目添加到列表框 例如在下面的列表框中
  • 列出 CalendarApp.Color 中的枚举键

    尝试使用以下代码在 Google 脚本中获取 Google CalendarApp Color 枚举中的键列表 var colors CalendarApp Color for var x in colors Logger log Colo
  • 代码合同。如何抑制生成代码的警告?

    如何关闭对 Linq2Sql 代码的静态检查 您可以通过将有问题的类标记为来抑制对静态代码的检查 ContractVerification false 如果您生成的类是partial您可以创建另一个文件 其中包含另一个部分 ial 并将其添
  • 报表查看器中的重叠表格

    我有一个报告查看器控件 我向其中提供 SSRS 报告 生成的报告相当大 无法适应单一视图 因此 当我们在 Firefox 11 或 chrome 15 上的 ReportViewer 中看到该报告时 呈现的表格是重叠的 但它在 IE 中运行
  • 我可以将网页的图像捆绑到一个文件中吗?

    我有一个包含大约 70 张图像的网页 我正在寻找一种将这些图像捆绑到资源文件中的方法 这并不是为了提高客户端性能 因为缓存等会解决这个问题 更多的是通过我们的 cms 在服务器端进行资产管理 我希望能够将单个资源部署到 cms 中 而不必创
  • Pandas 和 Numpy 中有关多线程的奇怪错误

    Numpy 的大部分功能都会默认启用多线程 例如 我在 8 核 intel cpu 工作站上工作 如果我运行脚本 import numpy as np x np random random 1000000 for i in range 10
  • 使用 DataTrigger 动态设置事件处理程序

    我有几个项目控件 我需要为其附加一个事件处理程序 PreviewMouseLeftButtonDown 仅在满足特定条件时发生 我用数据触发器为我的控件设计了一种样式 我检查了它的绑定并用常规财产设置者对于 BorderThickness
  • 哪种 Objective-C 类型适合处理金钱?

    哪种 Objective C 类型适合处理金钱 我需要一些与核心数据兼容的东西 有两种解决方案 Use an int 并始终跟踪以美分为单位的货币价值 或您所使用的任何货币的最小可能划分 仅使用整数计算 Use NSDecimalNumbe
  • C# 中的重载解析、扩展方法和泛型

    我的 C 源代码中有以下场景 class A class Dispatch
  • Python:用 re.sub 替换列表中的多个特定单词

    我有以下字符串并列出 changewords 我想将 word from list n 替换为 word from list 我不想替换 n 的所有实例 string Foo n value of something n Bar n Ano
  • TaskFactory 新 UI 创建

    如何使用 TaskFactory 创建新的 UI 元素 当我尝试时出现以下错误 调用线程必须是 STA 因为许多 UI 组件都需要它 示例代码 Dim txtBoxList as new List Of TextBox Sub StartT