首页 \ 问答 \ 使用多线程和WPF更新集合(Update Collection with multithreading and WPF)

使用多线程和WPF更新集合(Update Collection with multithreading and WPF)

目前我有一个扫描网络的课程:

public class Network {
   public event NewDeviceHandler NewDevice;
   public event ScanFinishedHandler ScanFinished;
   //...
   public void Scan() { /* ... */ }
}

我想在找到新Device后立即更新我的UI。 在这种情况下,最佳做法是什么? 我应该使用事件还是更好地使用像ObservableCollection这样的东西?

我必须在我的UI-Thread(WPF)中调用此方法。 我该怎么做?

  • 在我的UI-Application中创建一个新任务
  • 在扫描方法中创建一个新任务
  • 使用asnyc / await

非常感谢您的帮助。


At the moment I have a class for scanning the network:

public class Network {
   public event NewDeviceHandler NewDevice;
   public event ScanFinishedHandler ScanFinished;
   //...
   public void Scan() { /* ... */ }
}

I want to update my UI as soon as a new Device was found. What is the best practice in this case? Should I use events or is it better to use something like an ObservableCollection?

And I have to call this method in my UI-Thread (WPF). How should I do that?

  • Create a new Task in my UI-Application
  • Create a new Task in the Scan-Method
  • Use asnyc / await

Thank you very much for your help.


原文:https://stackoverflow.com/questions/37574038
更新时间:2019-12-13 07:37

最满意答案

如果要在找到新Device后立即更新UI,则只需要ObservableCollectionTask 。 例如:

Network课程中:

public event NewDeviceHandler<Device> NewDevice;

public void  StartScan()
{
    Task.Run(() => Scan() );
}

在视图模型中:

public ObservableCollection<Device> DevicesCollection { get; set; }

在代码隐藏中:

private Network networkService = new Network();
...
// Somewhere in initialization code:
networkService.NewDevice += (sender, device) => Dispatcher.Invoke(() => viewModel.DevicesCollection.Add(device) );
...
private void ScanButton_OnClick(object sender, RoutedEventArgs e)
{
    viewModel.DevicesCollection.Clear();
    networkService.StartScan();
}

If you want to update your UI as soon as a new Device was found, you will only need ObservableCollection and Task. For example:

In Network class:

public event NewDeviceHandler<Device> NewDevice;

public void  StartScan()
{
    Task.Run(() => Scan() );
}

In view-model:

public ObservableCollection<Device> DevicesCollection { get; set; }

In code-behind:

private Network networkService = new Network();
...
// Somewhere in initialization code:
networkService.NewDevice += (sender, device) => Dispatcher.Invoke(() => viewModel.DevicesCollection.Add(device) );
...
private void ScanButton_OnClick(object sender, RoutedEventArgs e)
{
    viewModel.DevicesCollection.Clear();
    networkService.StartScan();
}
2016-06-01

相关问答

更多

MVC4:ViewModel(带有radiobuttonlist)在HttpPost之后为空(MVC4: ViewModel (with radiobuttonlist) is empty after HttpPost)

我没有看到表单有如下ID的映射: @Html.HiddenFor(model => model.Id) 每个内部问题集合也应该具有Id,以便与表单一起发布。 因此,对于您可以拥有的每个问题,在表单的foreach循环中: @Html.HiddenFor(model => item.Question.Id) 该模型还具有MultipleChoiceQuestion类型的集合。 对于模型绑定到集合,集合元素的名称应具有带有序数字的name属性,如本文http://haacked.com/arch

如何在同一帐户上设置“Dev repo”(在prod和团队之间)(How to set up a “Dev repo” (between the prod and the team) on the same account)

在git中似乎存在一个基本的误解。 您有一个通过设置组织正确找到的回购。 那很棒。 你和你的开发人员在他们的回购中单独分工。 那也没关系。 现在,如果您是首席开发人员,并且想要了解人们的工作方式,那么您可以在GitHub上的中央组织中组织所有这些。 即开发者发送拉动请求并将它们拉入开发分支,您不必将它们拉入主控。 在您的开发分支中,您可以测试合并的代码,看它是否符合您的需求。 如果您不喜欢它,则不必将其与生产和/或主分支合并。 在git中,你使用分支机构来理清好事和坏事。 你批准的所有东西都合并

keepalived - 多个VRRP实例与多个VIP的1个实例(keepalived - multiple VRRP instances vs. 1 instance with multiple VIPs)

在这两种情况下,当MASTER失败时,所有VIP将一起故障转移,正如在这种情况下所预期的那样。 另一方面,更改优先级不会产生同样的影响: - 使用单个实例,更改优先级会使所有VIP进行故障转移 - 每个VIP有一个实例,更改优先级会使单个VIP进行故障转移 所以要问的问题是:您是否需要一次为一个VIP进行故障转移? In both cases, when the MASTER fails, all VIPs will fail over together, as expected in such

是否有适用于XP或Windows 2008 R2的.NET 4.0 WPF Performance Suite?(Is there a WPF Performance Suite for .NET 4.0 for XP or Windows 2008 R2? [closed])

适用于Windows 7和.NET Framework 4的Windows SDK 7.1版包括Performance Suite,并兼容这些版本的Windows和.Net 4.请参阅Windows SDK发布博客条目 Version 7.1 of the Windows SDK for Windows 7 and .NET Framework 4 includes the Performance Suite and is compatible with both these versions

具有可变儿童深度的d3.nest(d3.nest with variable children depth)

由于d3.nest使您在调用nest.entries之前提前注册嵌套键,因此无法通过nest.entries指定所有内容来使用可变数量的级别进行嵌套。 可能有用的一件事是递归使用nest.rollup函数来控制每个级别的值是什么样的。 在rollup内部,您可以决定每个条目元素是否应该是包含下一级详细信息的新d3.nest ,或者它是否应该是叶节点。 这是一个粗略的裂缝(假设level1将始终存在): function rollupFn(group) { var leaves = [],

是否可以在cocos2d-x中调整ccsprite的对比度?(Is it possible to adjust contrast of ccsprite in cocos2d-x?)

您可以通过使用setOpacity方法调整sprite的不透明度,或者使用CCFadeIn , CCFadeOut和CCFadeTo操作来获得闪烁效果。 编辑: 还有CCTintTo和CCTintBy动作将调整节点的RGB颜色。 You can get a blink effect by adjusting the opacity of the sprite with the setOpacity method and alternatively using the CCFadeIn, CCFa

撤消项目文件的“获取服务器版本”(Undo “take server version” of project file)

你不能撤消get; 修改后的版本已被覆盖。 但是,您可以将所有文件添加回项目中。 最简单的方法通常是启用“显示所有文件”,然后对于每个丢失的文件,您可以执行“包含在项目中”。 You can't undo the get; the version with your modifications has been overwritten. You can, however, add all the files back into the project. The easiest way is us

如果Textbox为空,则ASP.NET GridView不会从更改SqlDataSource.SelectCommand填充(ASP.NET GridView won't populate from changing SqlDataSource.SelectCommand if Textbox is empty)

通过向其上定义的Title属性添加一个默认值NULL来修改您的SqlDataSource,这应该可以解决问题。 你不需要标签,我还是不懂标签。 <asp:SqlDataSource runat="server" ID="SqlDataSourceSearchResults" ConnectionString='<%$ ConnectionStrings:DefaultConnection %>' SelectCommand=""> <SelectParameters> <

相关文章

更多

最新问答

更多
  • jsPlumb draggable element javascript函数(jsPlumb draggable element javascript function)
  • MVC4:ViewModel(带有radiobuttonlist)在HttpPost之后为空(MVC4: ViewModel (with radiobuttonlist) is empty after HttpPost)
  • 如何在同一帐户上设置“Dev repo”(在prod和团队之间)(How to set up a “Dev repo” (between the prod and the team) on the same account)
  • 如何在tcl中将eth0配置为发送方udp端口(how to configure eth0 as a sender udp port in tcl)
  • 在main方法中进行更改后传递给构造函数的TreeMap实例的行为是什么(What is the behavior of a TreeMap instance passed into a constructor following changes in main method)
  • 在这个的一些属性不同的颜色(Different color in some properties of this)
  • CURL没有返回任何内容(CURL Not returning anything)
  • MVC5注入依赖于城堡windsor的视图(MVC5 injecting dependency on a view with castle windsor)
  • CakePHP AJAX-Call:发生错误:未定义(CakePHP AJAX-Call: An error occured: undefined)
  • 如何用.aidl扩展名创建文件?(how to create a file with .aidl extension?)
  • 无法获得全尺寸动态WordPress灯箱图像显示(Cannot get full size dynamic WordPress lightbox image to display)
  • 使用Jsoup删除元素不起作用(Removing Element with Jsoup doesn't work)
  • 交叉编译ARM的MongoDB C ++驱动程序。(Cross compiling MongoDB C++ driver for ARM. Cannot find Boost Libraries)
  • ProgressDialog没有关闭(ProgressDialog not closing)
  • 单元测试DB中的JPA插入(Unit testing JPA insertion in the DB)
  • 点击谷歌服务对话框中的更新按钮(Click on update button in check google service dialog)
  • 适用于PhoneGap Build的iOS“缺少必需的57x57图标”(“Missing required 57x57 icon” for iOS on PhoneGap Build)
  • MVC ckeditor post编辑器值内联(MVC ckeditor post editor value inline)
  • Angular 2 Pipe - 无法读取未定义的属性'toString'(Angular 2 Pipe - Cannot read property 'toString' of undefined)
  • 安装引导加载程序(Installing bootloaders)
  • 用于确定最终如何包含头文件的工具(Tool to figure out how a header file is eventually being included)
  • 在将字符串转换为int [duplicate]之前检查字符串是否不是数字(Check if string is not a number before converting it to a int [duplicate])
  • 从脚本构建db2数据库以进行构建验证的工具?(Tools to build db2 database from scripts for build verification?)
  • 在偏移之后向FileOutputStream写一个数字(Write a number to FileOutputStream after an offset)
  • Javascript RegEx仅限数字(无特殊字符)(Javascript RegEx for Numbers Only (no special characters))
  • 我可以在PHP的Linux服务器上运行新的COM(“WScript.Shell”)(Can I run new COM(“WScript.Shell”) on linux servers in PHP)
  • 在Backbone.js中放置与视图不直接相关的代码(例如广告,分析等)的位置?(Where to place code not directly related to a view (such as ads, analytics etc) in Backbone.js?)
  • 适用于Mac和PC的一般开发人员必备软件综合列表[关闭](Comprehensive List of Essential Software for General Developers on Mac and PC [closed])
  • 将语言文本转换为模型(Transformation Language Text to Model)
  • 在控制器中的两个方法之间共享变量?(Sharing variables between two methods in a controller?)