在WPF / C#中这种线程处理效率低下吗? - c#

这是否比设置后台工作线程效率低?因为它运作良好,而且看起来更干净。在循环中,我调用BeginInvoke 3x-向主窗口datagrid添加行,并更新进度条和消息。

public MyConstructor()
{
    InitializeComponent();

    ThreadStart start = delegate()
    {
        for (...)
        {
            ...
            MyWindow.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                new Action(delegate()
                {
                    // Do something on the MyWindow thread.
                }
            ));
            ...
        }

        // Intensive loop now done and we close this processing window.
        this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
            new Action(delegate()
            {
                this.Close();
            }
        ));
    }; // ThreadStart

    new Thread(start).Start();
}

参考方案

可以,但有几点要点:

您可能应该在Thread对象上设置IsBackground,这样它才不会导致应用程序在退出时挂起。
如果这是短期活动,则不应创建新线程,而应使用ThreadPool.QueueUserWorkItem或.NET4上的新“任务”东西。
如果后台线程(池或手动创建的)上有未处理的异常,则该应用程序将以很少的故障失败。像“任务”这样的东西处理得更好。

您实际上并没有非常清楚地定义“效率”,但是BackgroundWorker通常是做这种事情的更好方法-如果没有其他选择,它将使用池线程,该池线程比手动创建的线程便宜得多。

为什么我无法更新字典中的test__user_id密钥? - python

我正在更新包含数据的字典,dict_temp = {'description': 'hello', 'id': 683, 'status': u'pending', 'test__user_id': 430} 我试图使用dict_temp …

在datagrid(wpf)中选择行索引 - c#

如何在datagrid中选择行索引? 事件SelectionChanged以下代码不起作用: private DataGridRow dgr = new DataGridRow(); private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { thi…

在Java游戏中实现拖放 - java

我正在做一个棋盘游戏,它是一个具有5种不同颜色图像的8x8网格。只要对象在行或列中彼此相邻,就可以交换对象。如果切换导致行或列中的3个或更多对象相同,则将其删除。如果切换未导致匹配,则不会发生切换。移除对象后,木板会塌陷,因此位于移除对象上方的对象会掉落到位,而新对象会从顶部掉入以填充空间。我想知道一种实现拖动操作和使对象掉落的好方法。我应该使用分层窗格吗?…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制

LeetCode题解统计城市的所有灯泡

这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…