稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool

【鸿蒙专题与实战】测试体系:单元测试、组件测试与 UI 测试 本文系统讲解鸿蒙开发中的三层测试实践:底层单元测试(用Hypium框架,优先覆盖纯函数、边界与异常)、中层ViewModel逻辑、顶层仅测3-5条关键UI路径。强调测试应“越往下写得越多”,因单元测试快且成本低,而UI测试慢易出错。通过实例说明断言拆分提升定位效率,结合覆盖率报告(hvigorwtest --coverage)发现盲区,核心是“用覆盖率找漏测,而非追求数字”。附五步落地清单:建测试文件、按优先级补用例、精简UI测试、生成报告、定位未覆盖行。下一篇将开启实战项目:从需求到上架全流程。 阅读详情
[索引页]
[源码下载]


稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool


作者: webabcd


介绍
Silverlight 2.0 使用Thread, Timer, BackgroundWorker, ThreadPool来实现多线程开发
    Thread - 用于线程的创建和控制的类
    Timer - 用于以指定的时间间隔执行指定的方法的类
    BackgroundWorker - 用于在单独的线程上运行操作
    ThreadPool - 线程池的管理类


在线DEMO
http://www.cnblogs.com/webabcd/archive/2008/10/09/1307486.html


示例
1、Thread.xaml
< UserControl  x:Class ="Silverlight20.Thread.Thread"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
    
< StackPanel  HorizontalAlignment ="Left"  Margin ="5" >
    
        
< TextBlock  x:Name ="txtMsg"   />
    
    
</ StackPanel >
</ UserControl >

Thread.xaml.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;

namespace  Silverlight20.Thread
{
    
public partial class Thread : UserControl
    
{
        
string result = "";

        
public Thread()
        
{
            InitializeComponent();

            Demo();
        }


        
void Demo()
        
{
            
/*
             * Thread - 用于线程的创建和控制的类
             *     Name - 线程名称
             *     IsBackground - 是否是后台线程(对于Silverlight来说,是否是后台线程没区别)
             *     Start(object parameter) - 启动后台线程
             *         object parameter - 为后台线程传递的参数
             *     IsAlive - 线程是否在执行中
             *     ManagedThreadId - 当前托管线程的唯一标识符
             *     ThreadState - 指定线程的状态 [System.Threading.ThreadState枚举]
             *     Abort() - 终止线程
             
*/


            
// DoWork 是后台线程所执行的方法(此处省略掉了委托类型)
            
// ThreadStart 委托不可以带参数, ParameterizedThreadStart 委托可以带参数
            System.Threading.Thread thread = new System.Threading.Thread(DoWork);
            thread.Name 
= "ThreadDemo";
            thread.IsBackground 
= true;
            thread.Start(
1000);

            result 
+= thread.IsAlive + "/r/n";
            result 
+= thread.ManagedThreadId + "/r/n";
            result 
+= thread.Name + "/r/n";
            result 
+= thread.ThreadState + "/r/n";

            
// thread.Join(); 阻塞调用线程(本例为主线程),直到指定线程(本例为thread)执行完毕为止

            
// 阻塞调用线程(本例为主线程)
            
// 如果指定线程执行完毕则继续(本例为thread执行完毕则继续)
            
// 如果指定线程运行的时间超过指定时间则继续(本例为thread执行时间如果超过5秒则继续)
            
// 返回值为在指定时间内指定线程是否执行完毕(本例中thread的执行时间为1秒,所以会返回true)
            if (thread.Join(5000)) 
            
{
                result 
+= "指定线程在5秒内执行完毕/r/n";
            }


            txtMsg.Text 
= result;
        }


        
void DoWork(object sleepMillisecond)
        
{
            System.Threading.Thread.Sleep((
int)sleepMillisecond);

            result 
+= "新开线程执行完毕/r/n";
        }

    }

}



2、Timer.xaml
< UserControl  x:Class ="Silverlight20.Thread.Timer"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
    
< StackPanel  HorizontalAlignment ="Left"  Margin ="5" >
    
        
< TextBlock  x:Name ="txtMsg"   />
    
    
</ StackPanel >
</ UserControl >

Timer.xaml.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;

namespace  Silverlight20.Thread
{
    
public partial class Timer : UserControl
    
{
        System.Threading.SynchronizationContext _syncContext;
        
// Timer - 用于以指定的时间间隔执行指定的方法的类
        System.Threading.Timer _timer;
        
private int _flag = 0;

        
public Timer()
        
{
            InitializeComponent();

            
// UI 线程
            _syncContext = System.Threading.SynchronizationContext.Current;

            Demo();
        }


        
void Demo()
        
{
            
// 输出当前时间
            txtMsg.Text = DateTime.Now.ToString() + "/r/n";

            
// 第一个参数:定时器需要调用的方法
            
// 第二个参数:传给需要调用的方法的参数
            
// 第三个参数:此时间后启动定时器
            
// 第四个参数:调用指定方法的间隔时间(System.Threading.Timeout.Infinite 为无穷大)
            _timer = new System.Threading.Timer(MyTimerCallback, "webabcd", 3000, 1000);
        }


        
private void MyTimerCallback(object state)
        
{
            
string result = string.Format("{0} - {1}/r/n", DateTime.Now.ToString(), (string)state);

            
// 调用 UI 线程。不会做自动线程同步
            _syncContext.Post(delegate { txtMsg.Text += result; }, null); 

            _flag
++;
            
if (_flag == 5)
                _timer.Change(
5000, 500); // 执行5次后,计时器重置为5秒后启动,每5毫秒的间隔时间执行一次指定的方法
            else if (_flag == 10)
                _timer.Dispose(); 
// 执行10次后,释放计时器所使用的全部资源
        }

    }

}



3、BackgroundWorker.xaml
< UserControl  x:Class ="Silverlight20.Thread.BackgroundWorker"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
    
< StackPanel  HorizontalAlignment ="Left"  Margin ="5" >

        
< StackPanel  Orientation ="Horizontal"  Margin ="5" >
            
< Button  x:Name ="btnStart"  Content ="开始"  Margin ="5"  Click ="btnStart_Click"   />
            
< Button  x:Name ="btnCancel"  Content ="取消"  Margin ="5"  Click ="btnCancel_Click"   />
        
</ StackPanel >
        
        
< StackPanel  Margin ="5" >
            
< TextBlock  x:Name ="txtProgress"  Margin ="5"   />
            
< TextBlock  x:Name ="txtMsg"  Margin ="5"   />
        
</ StackPanel >

    
</ StackPanel >  
</ UserControl >

BackgroundWorker.xaml.cs
/*
 * 演示用 BackgroundWorker 在后台线程上执行耗时的操作
 * 按“开始”键,开始在后台线程执行耗时操作,并向UI线程汇报执行进度
 * 按“取消”键,终止后台线程
 * BackgroundWorker 调用 UI 线程时会自动做线程同步
 
*/


using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;

namespace  Silverlight20.Thread
{
    
public partial class BackgroundWorker : UserControl
    
{
        
// BackgroundWorker - 用于在单独的线程上运行操作。例如可以在非UI线程上运行耗时操作,以避免UI停止响应
        System.ComponentModel.BackgroundWorker _backgroundWorker;

        
public BackgroundWorker()
        
{
            InitializeComponent();

            BackgroundWorkerDemo();
        }


        
void BackgroundWorkerDemo()
        
{
            
/*
             * WorkerSupportsCancellation - 是否支持在其他线程中取消该线程的操作
             * WorkerReportsProgress - 是否可以报告操作进度
             * ProgressChanged - 报告操作进度时触发的事件
             * DoWork - BackgroundWorker 调用 RunWorkerAsync() 方法时触发的事件。在此执行具体操作
             * RunWorkerCompleted - 操作完成/取消/出错时触发的事件
             
*/


            _backgroundWorker 
= new System.ComponentModel.BackgroundWorker();

            _backgroundWorker.WorkerSupportsCancellation 
= true;
            _backgroundWorker.WorkerReportsProgress 
= true;

            _backgroundWorker.ProgressChanged 
+= new System.ComponentModel.ProgressChangedEventHandler(_backgroundWorker_ProgressChanged);
            _backgroundWorker.DoWork 
+= new System.ComponentModel.DoWorkEventHandler(_backgroundWorker_DoWork);
            _backgroundWorker.RunWorkerCompleted 
+= new System.ComponentModel.RunWorkerCompletedEventHandler(_backgroundWorker_RunWorkerCompleted);
        }


        
private void btnStart_Click(object sender, RoutedEventArgs e)
        
{
            
// IsBusy - 指定的 BackgroundWorker 是否正在后台操作
            
// RunWorkerAsync(object argument) - 开始在后台线程执行指定的操作
            
//     object argument - 需要传递到 DoWork 的参数
            if (!_backgroundWorker.IsBusy)
                _backgroundWorker.RunWorkerAsync(
"需要传递的参数");
        }


        
private void btnCancel_Click(object sender, RoutedEventArgs e)
        
{
            
// CancelAsync() - 取消 BackgroundWorker 正在执行的后台操作
            if (_backgroundWorker.WorkerSupportsCancellation)
                _backgroundWorker.CancelAsync();
        }


        
void _backgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        
{
            
/*
             * DoWorkEventArgs.Argument - RunWorkerAsync(object argument)传递过来的参数
             * DoWorkEventArgs.Cancel - 取消操作
             * DoWorkEventArgs.Result - 操作的结果。将传递到 RunWorkerCompleted 所指定的方法
             * BackgroundWorker.ReportProgress(int percentProgress, object userState) - 向 ProgressChanged 汇报操作的完成进度
             *     int percentProgress - 操作完成的百分比 1% - 100%
             *     object userState - 传递到 ProgressChanged 的参数
             
*/


            
for (int i = 0; i < 10; i++)
            
{
                
if ((_backgroundWorker.CancellationPending == true))
                
{
                    e.Cancel 
= true;
                    
break;
                }

                
else
                
{
                    System.Threading.Thread.Sleep(
1000);
                    _backgroundWorker.ReportProgress((i 
+ 1) * 10, i);
                }

            }


            e.Result 
= "操作已完成";
        }


        
void _backgroundWorker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
        
{
            
// ProgressChangedEventArgs.ProgressPercentage - ReportProgress 传递过来的操作完成的百分比
            
// ProgressChangedEventArgs.UserState - ReportProgress 传递过来的参数
            txtProgress.Text = string.Format("完成进度:{0}%;参数:{1}",
                e.ProgressPercentage,
                e.UserState);
        }


        
void _backgroundWorker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        
{
            
/*
             * RunWorkerCompletedEventArgs.Error - DoWork 时产生的错误
             * RunWorkerCompletedEventArgs.Cancelled - 后台操作是否已被取消
             * RunWorkerCompletedEventArgs.Result - DoWork 的结果
             
*/


            
if (e.Error != null)
            
{
                txtMsg.Text 
+= e.Error.ToString() + "/r/n";
            }

            
else if (e.Cancelled)
            
{
                txtMsg.Text 
+= "操作被取消/r/n";
            }

            
else
            
{
                txtMsg.Text 
+= e.Result.ToString() + "/r/n";
            }

        }

    }

}



4、ThreadPool.xaml
< UserControl  x:Class ="Silverlight20.Thread.ThreadPool"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
    
< StackPanel  HorizontalAlignment ="Left"  Margin ="5" >

        
< TextBlock  x:Name ="txtMsgQueueUserWorkItem"  Text ="click here"  MouseLeftButtonDown ="txtMsgQueueUserWorkItem_MouseLeftButtonDown"  Margin ="30"   />

        
< TextBlock  x:Name ="txtRegisterWaitForSingleObject"  Text ="click here"  MouseLeftButtonDown ="txtRegisterWaitForSingleObject_MouseLeftButtonDown"  Margin ="30"   />

    
</ StackPanel >
</ UserControl >

ThreadPool.xaml.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;

namespace  Silverlight20.Thread
{
    
public partial class ThreadPool : UserControl
    
{
        
public ThreadPool()
        
{
            InitializeComponent();
        }


        
private void txtMsgQueueUserWorkItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        
{
            
// ThreadPool - 线程池的管理类

            
// QueueUserWorkItem(WaitCallback callBack, Object state) - 将指定方法加入线程池队列
            
//     WaitCallback callBack - 需要在新开线程里执行的方法
            
//     Object state - 传递给指定方法的参数
            System.Threading.ThreadPool.QueueUserWorkItem(DoWork, DateTime.Now);
        }


        
private void DoWork(object state)
        
{
            
// 作为线程管理策略的一部分,线程池在创建线程前会有一定的延迟
            
// 也就是说线程入队列的时间和线程启动的时间之间有一定的间隔

            DateTime dtJoin 
= (DateTime)state;
            DateTime dtStart 
= DateTime.Now;
            System.Threading.Thread.Sleep(
3000);
            DateTime dtEnd 
= DateTime.Now;

            
// Dispatcher.BeginInvoke() - 在与 Dispatcher 相关联的线程上执行指定的操作。自动线程同步
            this.Dispatcher.BeginInvoke(() =>
            
{
                txtMsgQueueUserWorkItem.Text 
+= string.Format("/r/n入队列时间{0} 启动时间{1} 完成时间{2}",
                    dtJoin.ToString(), dtStart.ToString(), dtEnd.ToString());
            }
);
        }



        
private void txtRegisterWaitForSingleObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        
{
            System.Threading.AutoResetEvent done 
= new System.Threading.AutoResetEvent(false);

            
// 为了传递 RegisteredWaitHandle 对象,要将其做一个封装
            RegisteredWaitHandlePacket packet = new RegisteredWaitHandlePacket();

            
// RegisterWaitForSingleObject - 注册一个 WaitHandle 。在超时或发信号的情况下对指定的回调方法做调用
            
// 第一个参数:需要注册的 WaitHandle
            
// 第二个参数:需要回调的方法(此处省略掉了委托类型)
            
// 第三个参数:传递给回调方法的参数
            
// 第四个参数:超时时间(到超时时间则调用指定的方法)
            
// 第五个参数:是否为一次调用(是到超时时间一次性调用指定的方法,还是每次超时时间后都调用指定的方法)
            packet.Handle = System.Threading.ThreadPool.RegisterWaitForSingleObject
                (
                    done,
                    WaitOrTimer,
                    packet,
                    
100,
                    
false
                );

            System.Threading.Thread.Sleep(
555);
            done.Set(); 
// 发出信号,调用 RegisterWaitForSingleObject 所指定的方法
        }


        
public void WaitOrTimer(object state, bool timedOut)
        
{
            RegisteredWaitHandlePacket packet 
= state as RegisteredWaitHandlePacket;

            
// bool timedOut - 是否是因为超时而执行到这里
            if (!timedOut) 
            
{
                
// 如果不是因为超时而执行到这里(即因为 AutoResetEvent 发出了信号而执行到这里),则注销指定的 RegisteredWaitHandle
                packet.Handle.Unregister(null);
            }


            
this.Dispatcher.BeginInvoke(() =>
            
{
                txtRegisterWaitForSingleObject.Text 
+=
                    String.Format(
"/r/n是否收到信号:{0}", (!timedOut).ToString());
            }
);
        }

    }


    
/// <summary>
    
/// 封装了 RegisteredWaitHandle 的类
    
/// </summary>

    public class RegisteredWaitHandlePacket
    
{
        
public System.Threading.RegisteredWaitHandle Handle { get; set; }
    }

}



OK
[源码下载]
【鸿蒙专题与实战】服务卡片开发:桌面上的「信息窗口」 本文详解鸿蒙服务卡片开发,从独立运行体系、配置文件form_config.json到UI构建与数据刷新机制。通过实现“今日待办”卡片,展示其尺寸声明、静态布局及主动/被动更新策略。强调卡片限制:不可滚动、禁用音视频与网络图片,仅支持onClick跳转。下篇将聚焦音视频开发,持续更新中,欢迎留言互动。 阅读详情

相关推荐

[YIUI付费插件] 超级循环列表yiuisuperscroll

本文介绍基于YIUI框架实现循环列表(LoopListView2)的完整流程:在Scroll Rect上挂载LoopListView2并配置预制体,为Item添加Click同步事件;通过ServerListPanelComponent与ServerInfoItemComponent配合,使用YIUISuperScrollListRenderer和YIUISuperScrollListOnClick实现数据渲染与点击响应,支持动态刷新列表、选中状态管理及服务器信息绑定,高效构建可交互的滚动列表界面。

Danielli博客 20

C#多线程编程介绍——使用thread、threadpool、timer

     在system.threading 命名空间提供一些使得能进行多线程编程的类和接口,其中线程的创建有以下三种方法:thread、threadpool、timer。下面我就他们的使用方法逐个作一简单介绍。 1. thread 这也许是最复杂的方法,但他提供了对线程的各种灵活控制。首先你必须使用他的构造函数创建一个线程实例,他的参数比较简单,只有一个threadstart 委托: publi...

weixin_34248258的博客 406

【鸿蒙开发进阶】第11篇:组件化开发:@Builder、@Component 与复用之道

组件化开发:@Builder、@Component 与复用之道

信息安全领域优质创作者|操作系统领域专家 296

C# WinForm多线程开发(二) ThreadPool 与 Timer

原文地址:点击打开链接 [摘要]本文介绍C# WinForm多线程开发之ThreadPool 与 Timer,并提供详细的示例代码供参考。

勿忘初心 3889

智能排班考勤系统原型

可实现从业务预测,到工时预估,再到人员分配全流程自动智能排班。可应用于客服行业或工厂的智能排班系统。

gywm15111336483的专栏 995

关于VS2022创建winform窗体后择项或选择工具箱项加载visionPro控件卡住,窗口未响应解决方法

解决winform加载工具箱选择项卡死问题

xiaokiss_的博客 3210

# WPF ComboBox 控件详解与使用 —WPF 中的控件(7)--下拉框选项列表控件( ComboBox)

ComboBox`(下拉框选项列表)是 WPF 中最常用的选择类控件之一,它在有限空间内提供下拉选项列表,支持**单选、可编辑输入、数据绑定、自定义项外观**等核心能力,继承自 `System.Windows.Controls.Primitives.Selector`。 本文将从基础属性、核心事件、基础用法、数据绑定、自定义模板、高级定制到最佳实践,逐一带代码注解进行讲解。

yunmaowu0917的博客 154

HDMI调试避坑指南:从AVI InfoFrame到通用控制包,这些DataIsland Packet细节千万别忽略

本文深入解析HDMI调试中DataIsland数据包的关键细节,包括AVI InfoFrame、通用控制包和音频时钟再生包(ACR)的配置与故障排查。通过实际案例和寄存器配置示例,帮助工程师快速定位显示异常、色彩失真和音频中断等问题,提升HDMI接口调试效率。

weixin_30897233的博客 635

从零搭建半导体设备上位机(五):三套 UI 库共存,HandyControl、MaterialDesign、Wu.Wpf 的样式基线

三套 UI 库共存:HandyControl、MaterialDesign、Wu.Wpf 的样式基线 这是「从零搭建半导体设备上位机」系列第5篇。一个 WPF 应用里同时装了 HandyControl、MaterialDesignThemes、Wu.Wpf 三套控件库。这篇讲它们为什么会打架、打架的具体机制是什么,以及怎么建立一套"谁也别想偷偷改我外观"的样式基线。 一个下拉框,白底白字 界面做完

samble的专栏 458

手把手教你用NetToPLCsim搭建西门子S7-1200仿真环境(附避坑指南)

本文详细指导如何利用NetToPLCsim与PLCSIM搭建西门子S7-1200仿真环境,实现无硬件条件下的PLC程序测试与上位机通信开发。内容涵盖软件选型、环境部署、关键参数配置及通信测试,并重点提供了连接失败、数据读写错误等常见问题的深度避坑指南,帮助工程师高效构建可靠的虚拟调试工作流。

a3b4c5的博客 613

从零到飞:在Ubuntu 22.04上为你的无人机搭建PX4-Autopilot开发环境

本文详细指导在Ubuntu 22.04上搭建PX4-Autopilot开发环境,涵盖系统依赖安装、源码获取、编译目标选择及Gazebo仿真测试。通过优化构建过程和调试技巧,帮助开发者快速为无人机部署稳定的飞控系统,实现从仿真到实机的平滑过渡。

weixin_26878995的博客 489

【QT入门到晋级】用开源的自定义控件开发

直接点击mainwindow.ui文件是看不到quc控件的,关键步骤是右键点击mainwindow.ui,右键菜单选择【Qt Designer】,在UI设计器中才能找到“Quc Widget”。注意:以上是前端调用自定义控件的方式,需要编译动态库等操作,相对要麻烦一些。如果有自定义控件的源码.h和.cpp文件,直接加入到现有qt项目中,以后台方式直接调用即可,以下是我分享过一个手搓的自定义控件类【QT自定义2D控件】QGraphics绘制仪表盘_qt仪表盘控件-优快云博客。

ocy的博客 175

基于CutLSTM-ATT 模型的刀具磨损预测-【一个月之内发一篇中文核心辅导】

基于CutLSTM-ATT 模型的刀具磨损预测-【一个月之内发一篇中文核心辅导】

315

K210+STM32+LVGL:手搓边缘AI智能安防监控网关

在传统的物联网或嵌入式毕设中,“智能安防”往往沦为“温湿度+蜂鸣器”的简单堆砌。由于单片机(如STM32)算力有限,无法在本地运行复杂的视觉AI模型,导致很多项目只能在云端处理图像,带来高延迟和隐私风险。本文将分享一个真正的边缘计算安防网关项目。我们采用“K210视觉协处理 + STM32F407主控 + LVGL高颜值UI”的分布式架构,完美解决了单芯片算力不足的痛点。项目不仅实现了明火与陌生人脸识别,还加入了多源传感器融合、5秒智能防抖、以及硬件与UI的双向闭环控制,是一套工业级标准的开源方案。

186

AEJoy —— 最受欢迎的 5 个 Ae 表达方式

NOTE] 原文作者我意识到表达式可能令人生畏,有些人宁愿复制粘贴有用的代码,而不愿学习这门语言。对此我完全理解。因此,我想与您分享我的。这些是我几乎在每个项目中都会使用的表达式,我认为它们极大地提升了工作流程。

ShaderJoy 的兴趣技术杂货铺 363

C#每日面试题-属性和字段的区别

在C#面试中,“属性(Property)和字段(Field)的区别”是基础且高频的考点。很多初学者会把两者混为一谈,甚至觉得“属性就是加了get/set的字段”,但这种理解只停留在表面。面试考察的核心,是对“封装思想”的理解,以及两者在语法特性、底层实现、实际应用中的本质差异。今天我们从“基础认知→核心差异→底层原理→实际应用→面试避坑”五个层面,把这个知识点讲透,既保证新手能看懂,又能满足面试的深度要求。

Amon的专栏 778

React 错误边界 Error Boundary

用类组件 ErrorBoundary 隔离渲染错误,讲清能接住/接不住、重置策略与上报。

JudithHuang的博客 295

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【元宝搜索开发者征文大赛】用 Vue + Ele把元宝搜索的返回值做成“能点开检查的证据卡片”ment UI

本文提出将“用户信任AI结论”转化为前端组件问题:针对元宝搜索返回的嵌套JSON字符串型Pages,通过解析生成可标注可信度的证据卡片,实现“可信/存疑/过期”三态标记。前端负责证据可视化与用户交互,后端专注检索逻辑,代理层保障密钥安全。通过自定义时效分档、容错解析与可展开卡片设计,构建可验证的AI结论信任链,突破传统“输入框+结果列表”的局限。

weixin_43787161的博客 369

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android Message源码阅读

本文梳理了Android Handler机制中Message的核心设计:链表结构、消息复用池(sPool)及回收机制,重点解析了异步消息与同步屏障(SyncBarrier)的协同机制。当主线程需优先处理UI绘制等高优先级任务时,系统通过postSyncBarrier插入屏障,使Looper跳过普通同步消息,优先执行标记为异步的UI渲染任务,确保帧率流畅。该机制是保障Android界面响应性的关键技术之一。

u012116089的博客 189

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

算法与UI拆分中遇到的问题及解决方式

算法与UI界面拆分解耦,算法设计成windows服务来供客户端调用

冰凌的博客 186

从 ArkUI V1 监听泥沼到 V2 精准更新的性能跳跃,重构状态数据流

起初以为只是简单的 API 替换,没想到在一次复杂表单交互中,整个页面出现了严重的掉帧与输入延迟。为了过渡,我试图在一个 V2 的父组件里,塞入一个原本用 V1 编写的子组件。这也是为什么在重构中,我强制团队在涉及数组更新时,必须通过封装好的工具方法来操作。必须精确到需要更新的最底层属性,如果只用在外层对象上,内层的频繁变动依然无法触发 UI 的刷新。变化时,框架能够直接定位到绑定该变量的 UI 节点进行刷新,完全没有多余的遍历。用性能分析工具跑一下,体会一下消除深度代理后,页面渲染性能的直线拉升。

2602_97267507的博客 284

DeepSeek Harness 创造模式完整教程:5 步创建插件、验证生效与保存专属模式

发布日期:2026-11-03 | 数据截至 2026-11-03,来源为各平台官网、中国信通院《大模型词元服务性能监测报告(2026年)》及公开研究资料2026年国内企业级大模型 API 服务商已分化为云厂商自营(阿里百炼、火山方舟、百度千帆、腾讯云 TokenHub)和独立聚合平台(七牛云 Token Plan、硅基流动)两大阵营,模型厂商直连(智谱 GLM、讯飞星火)则作为垂直场景补充。

aidoudoulong的博客 523

在Open-WebUI中提升向量化速度

让Open-WebUI AI聊天的向量化过程不超过10秒,而不是默认的20+分钟……

xyzzklk的博客 568

Qt_05基础界面组件

Qt 基础界面组件

u012660296的博客 252

LazyForEach 长列表滑动与渲染底层优化

当组件被复用时,系统会直接拿缓存里的组件,把新数据塞进去。这省去了组件实例化和布局计算的时间,是长列表丝滑的关键所在。条件切换,底层的 ArkUI 就会把前一个按钮销毁,重新创建另一个。对于几千条数据的列表,这会引发巨大的性能开销。里加一个复杂的数学计算,观察帧率瞬间掉到 30 以下的惨状,体会一下 UI 线程的脆弱。它的核心逻辑是:系统只渲染屏幕上看得见的节点,滑出屏幕外的节点会被回收进缓存池。'已选中' : '未选中'),层级达到了七八层,每次滑动系统都要重新计算所有子节点的尺寸,CPU 直接拉满。

2502_91284977的博客 186
上一篇: 稳扎稳打Silverlight(24) - 2.0通信之Socket, 开发一个多人聊天室
下一篇: 稳扎稳打Silverlight(26) - 2.0线程之Lock, Interlocked, EventWaitHandle, Monitor, ThreadStaticAttribute
webabcd
博客等级 码龄17年 28粉丝 911原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值