.NET MAUI 生命周期事件详解(附9种典型场景处理方案)

【MAUI】自定义事件日历 这篇文档介绍了一个周视图日历组件的实现方案,包含以下核心内容: 交互功能: 支持日期选择(TapGestureRecognizer实现) 提供视觉反馈(背景/文本颜色变化) 支持事件标记显示 日历头部: 使用CollectionView展示星期几 支持动态生成或固定显示星期数据 统一采用半透明白色文本样式 日期部分: 7列垂直布局显示一周日期 每个日期项包含圆形背景、日期文本和事件标记点 支持点击选择并传递参数 根据日期状态动态改变样式 该组件采用MVVM模式,通过ViewModel处理日期数据生成和状态管 阅读详情

第一章:.NET MAUI 应用生命周期概述

.NET MAUI(.NET Multi-platform App UI)应用在其运行过程中会经历多个状态转换,理解这些状态及其对应的事件对开发稳定、响应迅速的跨平台移动应用至关重要。应用生命周期管理不仅影响用户体验,还直接关系到资源释放、数据保存和后台任务处理。

应用状态与事件

在 .NET MAUI 中,应用主要经历以下几种核心状态:
  • Created:应用首次启动,完成初始化
  • Running:应用处于前台并正常运行
  • Resumed:应用从前台恢复,用户可交互
  • Suspended:应用进入后台,系统可能随时终止它
  • Stopped:应用被完全停止或销毁
这些状态通过 App.xaml.cs 文件中的方法进行监听和响应。例如:
// App.xaml.cs
public partial class App : Application
{
    public App()
    {
        InitializeComponent();
        // 设置启动页面
        MainPage = new MainPage();
    }

    protected override void OnStart()
    {
        // 应用启动时调用(每次从后台回到前台也可能触发)
        Console.WriteLine("Application started.");
    }

    protected override void OnSleep()
    {
        // 应用进入后台,应释放非必要资源
        Console.WriteLine("Application is sleeping.");
    }

    protected override void OnResume()
    {
        // 应用从前台恢复
        Console.WriteLine("Application resumed.");
    }
}

生命周期方法的应用场景

方法触发时机典型用途
OnStart应用启动或重新进入前台初始化服务、检查登录状态
OnSleep应用转入后台保存数据、取消定时器
OnResume应用恢复至前台刷新界面、重启动画
graph TD A[Application Created] --> B[OnStart] B --> C[Running] C --> D[OnSleep] D --> E[Suspended] E --> F[OnResume] F --> C

第二章:核心生命周期事件解析与应用

2.1 OnCreate:应用初始化时机与资源预加载策略

在Android应用生命周期中,onCreate()是组件创建的首个回调方法,是执行初始化逻辑的关键入口。此阶段适合完成界面布局加载、数据绑定及核心资源预加载。
资源预加载的最佳实践
为提升后续页面响应速度,可在onCreate()中启动异步任务预加载高频资源:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 预加载图片资源
    preloadImages();
}

private void preloadImages() {
    AsyncTask.execute(() -> {
        ImageLoader.getInstance().preload("https://example.com/banner.jpg");
    });
}
上述代码在主线程设置界面后,立即通过异步任务预加载网络图片,避免阻塞UI。参数savedInstanceState用于恢复状态,若非首次创建则其值不为null。
初始化时机对比
阶段是否可获取视图适用操作
onCreate是(需先setContentView)初始化、预加载
onStart是注册监听器

2.2 OnStart 与 OnResume:启动与恢复阶段的状态管理实践

在Android应用生命周期中,onStart 和 onResume 是两个关键回调方法,分别对应Activity可见但不可交互、以及可交互的状态。
方法调用时机对比
  • onStart:Activity变为用户可见时调用,但尚未获得焦点;常用于初始化UI更新或注册系统监听器。
  • onResume:Activity获取焦点并可响应用户输入,适合启动动画、恢复后台任务或开启传感器。
典型代码实现
protected void onStart() {
    super.onStart();
    // 恢复数据观察者
    registerLocationListener();
}

protected void onResume() {
    super.onResume();
    // 重启实时更新
    startLocationUpdates();
}
上述代码中,onStart注册位置监听,确保界面可见时开始接收数据;onResume则激活频繁的位置更新,保证前台精度。两者分工明确,避免资源浪费。

2.3 OnSleep:后台挂起时的数据持久化与资源释放方案

当应用进入后台挂起状态时,系统可能随时终止进程以释放资源。OnSleep 阶段是执行关键数据持久化和资源清理的最后时机。
数据同步机制
在挂起前,应将内存中的临时数据写入持久化存储。推荐使用异步非阻塞方式提交变更:
// 应用挂起时触发数据保存
func OnSleep() {
    // 异步保存用户会话
    go func() {
        if err := sessionManager.Save(context.Background()); err != nil {
            log.Error("Failed to save session: %v", err)
        }
    }()
    
    // 释放网络连接池
    connectionPool.Release()
}
上述代码中,sessionManager.Save 将未提交的用户状态写入数据库,connectionPool.Release() 主动关闭空闲连接,降低内存占用。
资源管理策略
  • 释放图像缓存等大内存对象
  • 取消未完成的网络请求
  • 暂停定时任务与后台轮询

2.4 OnDestroy:进程销毁前的清理逻辑与异常捕获技巧

在应用生命周期管理中,OnDestroy 是资源释放的关键阶段。此阶段需确保所有异步任务、文件句柄、网络连接等被正确关闭,防止资源泄漏。
典型清理操作清单
  • 取消正在进行的异步请求
  • 关闭数据库或文件流
  • 注销事件监听器或订阅
  • 清除定时器与缓存数据
带异常捕获的销毁逻辑示例
func (s *Service) OnDestroy() error {
    var errs []error

    if err := s.db.Close(); err != nil {
        errs = append(errs, fmt.Errorf("failed to close database: %w", err))
    }

    if err := s.file.Close(); err != nil {
        errs = append(errs, fmt.Errorf("failed to close file: %w", err))
    }

    if len(errs) > 0 {
        return errors.Join(errs...)
    }
    return nil
}
上述代码通过聚合多个关闭操作的错误,确保即使部分资源释放失败,也能继续执行后续清理,并最终返回综合错误信息,提升系统可观测性。

2.5 生命周期事件在跨平台设备上的行为差异分析

在跨平台应用开发中,生命周期事件的触发机制因操作系统和运行环境而异。Android、iOS 和 Web 平台对应用前后台切换的处理策略不同,直接影响事件回调的时机与顺序。
典型生命周期钩子对比
  • Android: onPause/onResume 主导可见性变化
  • iOS: applicationWillResignActive 进入后台前调用
  • Web: visibilitychange 依赖页面可见性 API
代码实现差异示例

document.addEventListener('visibilitychange', () => {
  if (document.hidden) {
    console.log('应用进入后台');
  } else {
    console.log('应用回到前台');
  }
});
上述代码在移动端浏览器中可正常响应,但在原生容器内可能被拦截或延迟,需结合平台特定桥接逻辑确保一致性。
行为差异对照表
平台前台→后台后台→前台
AndroidonPauseonResume
iOSapplicationDidEnterBackgroundwillEnterForeground
Webvisibilitychange (hidden)visibilitychange (visible)

第三章:典型场景中的生命周期处理模式

3.1 页面导航与生命周期事件的协同控制

在现代前端框架中,页面导航与组件生命周期的协同管理是确保数据一致性和用户体验流畅的关键。当用户触发路由跳转时,框架会按序执行离开当前页、进入目标页的生命周期钩子。
典型生命周期钩子调用顺序
  • beforeRouteLeave:离开当前路由前校验或清理状态
  • beforeRouteEnter:进入新路由前进行权限判断或预加载
  • mounted:组件挂载后初始化交互逻辑
导航守卫中的异步控制
router.beforeEach(async (to, from, next) => {
  if (to.meta.requiresAuth && !store.getters.isAuthenticated) {
    next('/login'); // 重定向至登录页
  } else {
    next(); // 允许导航
  }
});
上述代码展示了全局前置守卫如何结合路由元信息(meta)进行权限控制。参数 to 表示目标路由,from 为来源路由,next 是必须调用的方法以 resolve 钩子。异步逻辑可嵌入数据预取或身份验证流程,确保页面渲染前完成关键操作。

3.2 后台任务调度与生命周期状态的联动机制

在现代应用架构中,后台任务调度需与系统生命周期状态深度联动,以确保资源合理利用和任务执行的可靠性。
状态感知的任务触发
系统通过监听生命周期事件(如启动、暂停、恢复、关闭)动态控制后台任务的执行时机。例如,在服务启动时触发数据同步任务,在服务关闭前完成任务清理。
// 监听服务生命周期事件
func OnLifecycleEvent(event string) {
    switch event {
    case "STARTED":
        StartScheduledTasks()  // 启动定时任务
    case "STOPPING":
        DrainTasksGracefully() // 优雅停止任务
    }
}
上述代码展示了服务在不同生命周期阶段调用对应任务控制函数,StartScheduledTasks 初始化调度器,DrainTasksGracefully 确保运行中任务完成。
调度策略与状态匹配
  • 运行态:允许所有任务调度
  • 暂停态:暂停新任务派发
  • 关闭态:触发任务回滚或持久化

3.3 状态保存与恢复:应对热启动与冷启动的用户体验优化

在移动应用和Web应用中,状态保存与恢复是保障用户体验连续性的关键技术。当应用经历热启动或冷启动时,系统可能销毁并重建界面组件,若未妥善处理状态,用户将面临数据丢失或界面重置的问题。
ViewModel 与 onSaveInstanceState 协同工作
Android 推荐使用 ViewModel 保存界面相关数据,配合 onSaveInstanceState 存储轻量级状态。ViewModel 在配置变更时保留数据,而实例状态则适用于进程被杀后的恢复。

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("input_text", editText.getText().toString());
}
该代码将输入框内容存入 Bundle,系统在 Activity 重建时通过 onRestoreInstanceState 恢复。注意仅适合存储少量可序列化数据。
持久化状态管理策略
对于复杂状态,应结合本地数据库(如 Room)或 DataStore 实现持久化。以下为不同存储方式的适用场景:
方式数据大小适用场景
SharedPreferences小简单键值对
DataStore中小类型安全、协程支持
Room大结构化数据持久化

第四章:高级应用场景与最佳实践

4.1 多窗口环境下生命周期事件的独立性与共享边界

在现代桌面与Web应用中,多窗口架构日益普遍。每个窗口通常拥有独立的生命周期事件(如创建、激活、销毁),但又可能共享部分状态或资源。
生命周期的独立性
各窗口的初始化与销毁互不阻塞,可通过事件循环独立响应用户操作。例如,在Electron中:

const { BrowserWindow } = require('electron')
const win1 = new BrowserWindow({ show: true })
win1.loadURL('https://example.com')

const win2 = new BrowserWindow({ show: true })
win2.loadURL('https://example.com/dashboard')
上述代码创建两个独立窗口,各自管理其渲染进程与生命周期钩子,互不影响启动与关闭顺序。
共享边界与数据同步机制
尽管生命周期独立,窗口间常需共享认证状态或缓存数据。可通过主进程全局变量或消息通道实现通信:
  • 使用ipcMain与ipcRenderer跨窗口传递事件
  • 通过sharedWorker或localStorage维持一致状态
特性独立性共享性
生命周期管理✔️ 独立触发❌ 不耦合
状态数据❌ 隔离默认✔️ 可显式共享

4.2 结合依赖注入实现服务生命周期的精准管控

在现代应用架构中,依赖注入(DI)不仅是解耦组件的关键手段,更是服务生命周期管理的核心机制。通过 DI 容器,开发者可精确控制对象的创建与销毁时机。
服务生命周期的三种模式
  • Singleton:应用生命周期内仅创建一次实例;
  • Scoped:每个请求或作用域内创建一个实例;
  • Transient:每次请求依赖时都创建新实例。
代码示例:注册不同生命周期的服务
services.AddSingleton<ICacheService, RedisCache>();
services.AddScoped<IUserService, UserService>();
services.AddTransient<IEmailSender, SmtpEmailSender>();
上述代码在 ASP.NET Core 的 Startup.cs 中注册服务。Singleton 适用于全局共享状态,如缓存;Scoped 常用于数据库上下文,确保单次请求中实例一致;Transient 则适合轻量、无状态服务。
依赖解析流程
请求进入 → DI 容器解析根服务 → 递归构建依赖树 → 按生命周期提供实例 → 执行业务逻辑 → 释放 Scoped/Transient 资源

4.3 使用消息聚合器解耦跨页面的生命周期通知

在复杂应用中,多个页面或组件常需响应彼此的生命周期事件。直接依赖会导致紧耦合,难以维护。引入消息聚合器(Message Aggregator)可有效解耦通信。
核心机制
消息聚合器作为中心枢纽,接收发布者的消息并广播给订阅者,无需知晓对方存在。

class MessageAggregator {
  private subscribers: { [event: string]: Function[] } = {};

  publish(event: string, data: any) {
    if (this.subscribers[event]) {
      this.subscribers[event].forEach(callback => callback(data));
    }
  }

  subscribe(event: string, callback: Function) {
    if (!this.subscribers[event]) {
      this.subscribers[event] = [];
    }
    this.subscribers[event].push(callback);
  }
}
上述实现中,`publish` 触发事件,`subscribe` 注册监听。页面A可在销毁前发布 `pageADestroyed` 事件,页面B通过订阅该事件执行相应逻辑,实现无感知通信。
优势对比
方式耦合度可维护性
直接调用高低
消息聚合器低高

4.4 高频切换场景下的性能监控与内存泄漏防范

在高频组件切换的前端应用中,性能瓶颈常源于未释放的事件监听和定时器,导致内存持续增长。
监控指标采集
关键性能指标包括每秒帧率(FPS)、堆内存使用量及重排重绘次数。可通过 performance.memory 获取堆信息:

// Chrome 环境下获取内存使用
setInterval(() => {
  const { usedHeapSize, totalHeapSize } = performance.memory;
  console.log(`内存使用: ${(usedHeapSize / totalHeapSize * 100).toFixed(2)}%`);
}, 5000);
该代码每5秒输出一次JavaScript堆使用率,有助于识别内存增长趋势。
常见泄漏场景与防范
  • 组件卸载前未清除 setInterval 或 setTimeout
  • DOM 事件绑定未解绑,导致引用无法回收
  • 闭包持有外部对象引用,阻碍垃圾回收
推荐在 React 中使用 useEffect 清理副作用:

useEffect(() => {
  const timer = setInterval(fetchData, 1000);
  return () => clearInterval(timer); // 组件卸载时清理
}, []);

第五章:总结与未来展望

云原生架构的持续演进
现代企业正加速向云原生转型,Kubernetes 已成为容器编排的事实标准。实际案例中,某金融企业在迁移核心交易系统至 K8s 时,采用 Istio 实现灰度发布,显著降低上线风险。其关键配置如下:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: trading-service
spec:
  hosts:
    - trading.prod.svc.cluster.local
  http:
    - route:
        - destination:
            host: trading.prod.svc.cluster.local
            subset: v1
          weight: 90
        - destination:
            host: trading.prod.svc.cluster.local
            subset: v2
          weight: 10
AI 驱动的自动化运维
AIOps 正在重塑运维体系。某电商平台通过引入机器学习模型分析日志流,提前 47 分钟预测数据库慢查询高峰,准确率达 92%。其技术栈包括:
  • 日志采集:Fluent Bit + Kafka
  • 特征工程:基于 Prometheus 的指标滑动窗口统计
  • 模型训练:使用 PyTorch 构建 LSTM 异常检测网络
  • 告警联动:自动触发 Horizontal Pod Autoscaler 调整副本数
边缘计算与低延迟场景融合
在智能制造领域,某汽车装配线部署边缘节点运行轻量级 K3s 集群,实现视觉质检结果毫秒级反馈。以下为边缘服务资源限制策略:
服务模块CPU 请求内存限制QoS 策略
image-inference200m512MiBurstable
data-forwarder100m256MiGuaranteed
.NET MAUI 手搓 UDP/TCP 通信 通过本文,展示了在 .NET MAUI 中如何使用 UDP 和 TCP 实现网络通信。无论是基于速度的 UDP 还是基于可靠性的 TCP,都可以轻松集成到 .NET MAUI 的跨平台应用中。 阅读详情

相关推荐

.NET MAUI 基础知识

NET Multi-platform App UI (.NET MAUI) 是微软推出的新一代跨平台UI框架,是Xamarin.Forms的继任者。它允许开发者使用单一的代码库和项目结构,创建可在Android、iOS、macOS和Windows上运行的本地应用程序。.NET MAUI采用C#和XAML作为开发语言,为开发者提供了统一的编程模型和API,简化了跨平台应用开发流程。

冰茶的博客 2993

为什么你的.NET MAUI 应用在后台被终止?:3分钟搞懂OnSleep与OnResume机制

快速掌握.NET MAUI应用后台终止原因,深入解析应用生命周期中OnSleep与OnResume机制,涵盖前后台切换场景与资源释放策略。有效提升应用稳定性与用户体验,值得收藏。

FastSolve的博客 333

.NET MAUI跨平台串口通讯方案

MAUI跨平台串口通信架构设计采用分层模式,核心是共享业务逻辑层与平台特定实现。通过定义统一的ISerialPortService接口,实现了Windows、Android、iOS和macOS四大平台的串口通信功能。Windows平台使用System.IO.Ports类库,Android通过USB Host模式实现,iOS基于ExternalAccessory框架,macOS则采用IOKit。该设计支持串口连接管理、数据收发等核心功能,并通过事件机制实现异步通信。架构采用条件编译区分各平台实现,确保代码复用

冰茶的博客 1664

【MAUI】页面事件

在 .NET Multi-platform App UI (MAUI) 中,页面事件是用于处理页面生命周期和用户交互的重要机制。这些事件可以帮助你在页面的不同阶段执行特定的操作,例如加载数据、处理用户输入、保存状态等。

欢迎指错||纠正||建议||水评+点赞&&评论&&关注&&转发 1245

【MAUI】生命周期事件

本文介绍了应用程序生命周期中的关键方法:CreateWindow用于初始化主窗口;OpenWindow和CloseWindow分别处理窗口的打开与关闭;CleanUp用于资源清理;OnSleep和OnResume分别在应用进入后台和恢复前台时触发;OnStart执行初始化操作。这些方法构成了完整的应用生命周期管理,其中启动顺序为CreateWindow→OnStart。文档还提供了微软MAUI应用生命周期的参考链接。

欢迎指错||纠正||建议||水评+点赞&&评论&&关注&&转发 546

.net MAUI应用生命周期

虽然 .NET MAUI 定义为响应引发的平台生命周期事件而调用的委托,但它仅公开一组常见的平台生命周期事件。但是,它还包括一种机制(通常适用于库作者),该机制支持应用在引发其他平台生命周期事件时收到通知。为 .NET MAUI 未公开的平台生命周期事件注册事件处理程序。在平台生命周期事件的事件处理程序中,检索实例并调用其方法,同时指定平台事件名称作为其参数。然后,想要接收平台生命周期事件通知的应用应修改其类的方法,以调用对象上的方法。然后,在对象上调用AddEvent。

A_nanda的博客 1145

应用卡顿崩溃频发?,一文读懂.NET MAUI 生命周期管理最佳实践

解决.NET MAUI应用卡顿崩溃,掌握应用生命周期管理是关键。本文深入解析.NET MAUI应用生命周期各阶段及响应策略,涵盖后台处理、资源释放与状态保存等最佳实践,提升应用稳定性与用户体验。值得收藏

FuncTide的博客 416

.NET MAUI应用生命周期事件全解析:从OnStart到OnResume的实战指南与最佳实践

本文深入解析了.NET MAUI应用生命周期中的关键事件(OnStart/OnSleep/OnResume),介绍了它们的触发时机与平台差异(Android/iOS),并通过实例演示了具体实现方法。主要内容包括:1)生命周期事件概述,说明了每个事件的作用场景;2)跨平台差异分析,比较了Android和iOS系统的不同行为;3)完整实现步骤,从项目创建到日志记录,提供了可运行的代码示例。文章旨在帮助开发者掌握应用状态管理,优化用户体验,确保数据在不同生命周期阶段得到正确处理。

理论都是虚的,代码才是王道。 257

.NET MAUI 生命周期详解:为什么你的OnSleep方法没有被调用?

掌握.NET MAUI应用生命周期,解决OnSleep未触发问题。详解OnCreate、OnStart、OnSleep和OnResume等核心方法在不同平台的执行时机与常见陷阱,适用于跨平台移动开发场景。帮你精准控制应用状态管理,提升用户体验,值得收藏。

StepNexus的博客 462

C语言编写Picard迭代和牛顿迭代法

为了完成学校计算方法的作业,花了两个多星期将所有实验报告编写出来,看到同桌找代码的辛苦,优快云也没有这类代码,我只是一时兴起,想分享我写的代码与大家共飨,有错误还请多多指正,代码都不难,也是为了让优快云帮我保存下,我辛辛苦苦做出来的,倘若能给别人带来一丝一毫的帮助,我都万分荣幸。 1:什么是Picard迭代 先弄一个满足f(x) = 0的函数将其转化为x= 正在上传… 重新上传 取消 ...

mohenxiang的博客 4699

卫星图像检测,分割,跟踪,超分辨率,数据集调研,以及论文笔记

目标检测,针对物体有很多类如桥,烟囱,罐子等,有静态图像下的检测,也就是图像源头多来自谷歌地图,但是前后帧没有任何联系,并且谷歌地图相对来说比较清楚,难度小一点,也有粗粒度以及较细粒度的检测,然后卫星视频的数据集较少,则可以通过前后帧的联系来辅助检测,并且卫星帧基本上只对车,船,飞机,火车进行检测,没有进行细粒度的检测即将车辆分类为卡车,皮卡,小轿车,但是关船,则可以分类为货船以及军舰,因为目前的卫星视频中小车实在太少了,难以进行更细粒度的检测。luojia 三号卫星。

zhangzhao147的博客 4707

技术速递|.NET 9 中的 .NET MAUI 性能特性

NET 9 通过完全剪裁和 NativeAOT 为 .NET MAUI 应用程序带来了性能提升。这些功能可以减少应用程序体积并提升启动速度,从而让开发者构建更高效、更流畅的应用程序。通过使用和等工具,开发者可以深入分析应用程序的性能。要全面了解 .NET MAUI 的裁剪和 NativeAOT,请参阅有关该主题的.NET Conf 2024 会议。

MicrosoftReactor的博客 1787

Coppelia Sim (v-REP)仿真 机器人3D相机手眼标定与实时视觉追踪 (一)

先把这连个都添加到场景中,然后把kinect的depth相机拖到vision sensor中,把kinect的script也拖到vision sensor中,同时要注意修改深度相机的坐标,及修改script,删掉/rgb部分。由于需要导入到仿真场景中PDF文件不能直接导入,所以需要生成图下文件,使用windows自带的画图工具,生成以厘米为单位的图像格式,大小和标定板的设置大小一直。可以生成需要用的标定板的文件,设置标定板的大小,棋盘格的大小,等相关的参数,之后可以保存PDF文件。设置plane的大小。

hong3731的专栏 1753

Xamarin 与 .NET MAUI:.NET跨平台原生移动App开发前世今生

在移动应用开发领域,开发者长期面临着一个核心挑战:如何用一套代码为iOS和Android两大平台开发高质量的原生应用?Xamarin的出现曾为C#开发者带来了曙光,而现在,.NET MAUI正接过接力棒,开启了跨平台开发的新篇章。

李赛赛的专栏 1633

滑模控制概述

滑模控制概述1.滑模控制概念2.滑模控制原理3.滑模控制设计步骤4.研究现状5.发展趋势5.1自适应滑模变结构控制5.2模糊滑模控制5.3神经网络与滑模控制的结合 1.滑模控制概念   滑模控制(Sliding Mode Control,SMC)是一种特殊类型的变结构控制(Variable Structure Control,VSC),因此又称之为滑模变结构控制,是近年来广泛应用和发展的一种控制方法。滑模控制本质上是一种非线性控制,即控制结构随时间变化而变化。滑模变结构控制是非线性系统中普遍采用的一种分析方

shiyi20190828的博客 2万+

告别‘Duang’的一声:手把手解决RK3588开发板PCIe初始化卡死问题(DTS修改实战)

本文详细介绍了解决RK3588开发板PCIe初始化卡死问题的完整过程,包括问题诊断、DTS文件修改及编译烧写步骤。通过禁用未使用的PCIe硬件资源,有效解决了启动卡死问题,为嵌入式开发者提供了实用的调试方法和经验总结。

weixin_30753873的博客 216

【.NET MAUI开发避坑指南】:导航栈内存泄漏的9大诱因与优化方案

解决.NET MAUI导航卡顿与内存泄漏难题,深入剖析导航栈管理的9大常见错误及优化策略。涵盖页面入栈出栈控制、事件解绑、生命周期协调等关键方法,提升应用性能与用户体验,值得收藏。

IterLoom的博客 1035

大数据领域数据采集的人工智能辅助技术

在大数据时代,“数据是石油”的隐喻早已深入人心,但采集高质量数据的过程却像“在大海里捞针”——数据源分散如繁星、格式杂乱如碎片、质量参差不齐如泥沙,传统采集方法(写死的脚本、固定的ETL流程)早已力不从心。这篇文章将带你走进AI辅助数据采集的世界:我们会用“智能捕鱼船”的比喻拆解AI如何解决传统采集的痛点,深入解析“数据源自动发现”“自适应数据解析”“实时质量管控”等核心技术的原理,用代码示例还原AI采集的真实流程,最后探讨多模态采集、联邦学习等未来趋势。

小程序开发 2355

揭秘.NET MAUI应用生命周期:3分钟搞懂启动、暂停、恢复与销毁全过程

快速掌握.NET MAUI 的应用生命周期,深入解析应用启动、暂停、恢复与销毁全过程,适用于跨平台移动开发场景。了解各阶段事件处理方法与最佳实践,提升应用稳定性与用户体验。值得收藏

AlgoFun的博客 855

PyTorch深度学习实战(41)——循环神经网络与长短期记忆网络

循环神经网络 (Recurrent Neural Network, RNN) 通过将前一个时间步的隐藏状态作为当前时间步的输入,实现对序列数据的建模,由于循环连接的存在,RNN 能够捕获时间依赖关系,然而,RNN 在处理长期依赖性问题时会遇到困难。为了解决这个问题,提出了 LSTM,通过引入门控机制改进 RNN 来有效地处理长期依赖关系。在本节中,了解了 LSTM 和 RNN 的基本原理,并介绍了如何在 PyTorch 中实现 LSTM。

盼小辉丶的博客 1万+

基于ESP32和OV5640的目标检测系统

本文详细介绍了基于ESP32-S3和OV5640摄像头构建目标检测系统的完整方案。系统采用YOLOv8-Nano轻量级模型,通过INT8量化实现边缘部署,在UXGA分辨率下达到25fps帧率。文章从硬件选型、图像采集优化、模型量化部署、实时推理流水线构建等维度展开,重点解决了内存管理、电源稳定性和异常处理等嵌入式系统关键问题。该方案在资源受限条件下实现了150ms以内的端到端延迟,为物联网视觉应用提供了低成本、低功耗的解决方案,适用于智能家居、工业检测等多个场景。

reset2021的博客 329

探索 Maui.BottomSheet:为您的 .NET MAUI 应用增添动态交互

探索 Maui.BottomSheet:为您的 .NET MAUI 应用增添动态交互 项目介绍 Maui.BottomSheet 是一个专为 .NET MAUI 应用设计的开源库,旨在为开发者提供一种简单而强大的方式来展示底部弹出页面。无论您是在开发 Android 还是 iOS 应用,Maui.BottomSheet 都能帮助您轻松实现底部弹出窗口的功能,提升用户体验。 项目技术分析 Maui....

gitblog_01018的博客 735

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

如何使用.NET MAUI开发Android扫码应用

NETMAUI是Xamarin的进化版,如果你已经用了Xamarin,那么可以尝试把工程移植到.NETMAUI。这篇文章分享下我的移植心得。

yushulx的专栏 7859

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

怀旧版电脑GBC模拟器

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

C#开发者必看的Blazor Hybrid进阶技巧(.NET MAUI 9.0深度整合方案)

掌握C#实现跨平台桌面应用(.NET MAUI 9.0+Blazor Hybrid)的进阶技巧,解决界面统一与性能优化难题。涵盖企业级应用开发场景,结合Blazor Web技术栈与原生控件集成,提升开发效率与用户体验。值得收藏的深度整合方案。

QuickProceed的博客 815

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

学习.NET MAUI Blazor(三)、创建.NET MAUI Blazor应用并使用AntDesignBlazor

大致了解了Blazor和MAUI之后,尝试创建一个.NET MAUI Blazor应用。 **需要注意的是:** 虽然都叫MAUI,但`.NET MAUI`与`.NET MAUI Blazor` 并不相同,MAUI还是以`xaml`为主,而MAUI Blazor则是以`razor`为主。

What If... 2945

ZXing.Net.Maui 常见问题解决方案

ZXing.Net.Maui 是 ZXing.Net.Mobile 的继任者,专为 .NET MAUI 应用程序设计的条码扫描和生成库。该项目的主要编程语言是 C#。它允许开发者在 .NET MAUI 应用中轻松集成条码扫描功能,支持多种条码格式,并且提供了丰富的配置选项。 ## 新手使用注意事项及解决方案 ### 1. 安装和初始化问题 **问题描述**:新手在安装 ZXing.Net.M...

gitblog_07089的博客 1088
上一篇: 【C#开发者必看】:深入解析LINQ GroupBy 返回类型与后续操作难题
下一篇: strstr 与 stristr 性能对比(真实百万级数据测试):别再为兼容性牺牲效率!
quickcode
博客等级 码龄19年 146粉丝 1996原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值