C# 延迟初始化

一个对象的延迟初始化意味着该对象的创建将会延迟至第一次使用该对象时。(在本主题中,术语“延迟初始化”和“延迟实例化”是同义词。)延迟初始化主要用于提高性能,避免浪费计算,并减少程序内存要求。 以下是最常见的方案:

  • 有一个对象的创建开销很大,而程序可能不会使用它。 例如,假定您在内存中有一个 Customer 对象,该对象的 Orders 属性包含一个很大的 Order 对象数组,该数组需要数据库连接以进行初始化。 如果用户从未要求显示 Orders 或在计算中使用其数据,则没有理由使用系统内存或计算周期来创建它。 通过使用Lazy<Orders> 将 Orders 对象声明为延迟初始化,可以避免在不使用该对象的情况下浪费系统资源。

  • 有一个对象的创建开销很大,您想要将创建它的时间延迟到完成其他开销大的操作之后。 例如,假定您的程序在启动时加载若干个对象实例,但只有一些对象实例需要立即执行。 通过将不必要的对象的初始化延迟到已创建必要的对象之后,可以提高程序的启动性能。

尽管您可以编写自己的代码来执行延迟初始化,但我们推荐使用 Lazy<T>。 Lazy<T> 及其相关的类型还支持线程安全,并提供一致的异常传播策略。

 

http://msdn.microsoft.com/ZH-CN/library/dd997286(v=vs.110).aspx

转载于:https://www.cnblogs.com/fengye87626/p/4203338.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
海康相机的触发延迟参数可以通过 SDK 中提供的 HCNetSDK.dll 和 PlayCtrl.dll 来实现。具体步骤如下: 1. 引入相应的命名空间: ```csharp using System.Runtime.InteropServices; using System.Threading; ``` 2. 调用 HCNetSDK.dll 和 PlayCtrl.dll 中的初始化方法: ```csharp [DllImport("HCNetSDK.dll")] public static extern bool NET_DVR_Init(); [DllImport("PlayCtrl.dll")] public static extern bool PlayM4_Init(); ``` 3. 登录相机并设置触发模式和延迟时间: ```csharp [DllImport("HCNetSDK.dll")] public static extern int NET_DVR_Login_V30(string sDVRIP, int wDVRPort, string sUserName, string sPassword, ref NET_DVR_DEVICEINFO_V30 lpDeviceInfo); [DllImport("HCNetSDK.dll")] public static extern bool NET_DVR_SetDVRConfig(int lUserID, uint dwCommand, int lChannel, IntPtr lpInBuffer, uint dwInBufferSize); public struct NET_DVR_TIME_EX { public ushort wYear; public ushort wMonth; public ushort wDay; public ushort wHour; public ushort wMinute; public ushort wSecond; public ushort wMilliSec; public ushort wReserved; } [DllImport("HCNetSDK.dll")] public static extern bool NET_DVR_SetupAlarmChan_V30(int lUserID, ref NET_DVR_SETUPALARM_PARAM lpSetupParam); NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30(); int userID = NET_DVR_Login_V30("192.168.1.64", 8000, "admin", "12345", ref deviceInfo); if (userID < 0) { Console.WriteLine("登录失败!"); return; } NET_DVR_SETUPALARM_PARAM alarmParam = new NET_DVR_SETUPALARM_PARAM { dwSize = (uint)Marshal.SizeOf(typeof(NET_DVR_SETUPALARM_PARAM)) }; int handle = NET_DVR_SetupAlarmChan_V30(userID, ref alarmParam); IntPtr delay = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(uint))); Marshal.WriteInt32(delay, 1000); // 设置触发延迟为 1 秒 NET_DVR_TIME_EX struTime = new NET_DVR_TIME_EX { wYear = (ushort)DateTime.Now.Year, wMonth = (ushort)DateTime.Now.Month, wDay = (ushort)DateTime.Now.Day, wHour = (ushort)DateTime.Now.Hour, wMinute = (ushort)DateTime.Now.Minute, wSecond = (ushort)DateTime.Now.Second, wMilliSec = (ushort)DateTime.Now.Millisecond, wReserved = 0 }; NET_DVR_STD_CONFIG config = new NET_DVR_STD_CONFIG { dwSize = (uint)Marshal.SizeOf(typeof(NET_DVR_STD_CONFIG)), lpInBuffer = delay, dwInBufferSize = (uint)Marshal.SizeOf(typeof(uint)), lpStatusBuffer = IntPtr.Zero, dwStatusSize = 0, lpOutBuffer = IntPtr.Zero, dwOutBufferSize = 0 }; NET_DVR_SetDVRConfig(userID, (uint)NET_DVR_GET_TIMECFG, 0, ref config, (uint)Marshal.SizeOf(typeof(NET_DVR_STD_CONFIG))); NET_DVR_STD_CONFIG triggerConfig = new NET_DVR_STD_CONFIG { dwSize = (uint)Marshal.SizeOf(typeof(NET_DVR_STD_CONFIG)), lpInBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(NET_DVR_TIME_EX))), dwInBufferSize = (uint)Marshal.SizeOf(typeof(NET_DVR_TIME_EX)), lpStatusBuffer = IntPtr.Zero, dwStatusSize = 0, lpOutBuffer = IntPtr.Zero, dwOutBufferSize = 0 }; Marshal.StructureToPtr(struTime, triggerConfig.lpInBuffer, false); NET_DVR_SetDVRConfig(userID, (uint)NET_DVR_SET_TIMECFG, 0, ref triggerConfig, (uint)Marshal.SizeOf(typeof(NET_DVR_STD_CONFIG))); NET_DVR_STD_CONTROL triggerControl = new NET_DVR_STD_CONTROL { dwSize = (uint)Marshal.SizeOf(typeof(NET_DVR_STD_CONTROL)), lpInBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(uint))), dwInBufferSize = (uint)Marshal.SizeOf(typeof(uint)), lpOutBuffer = IntPtr.Zero, dwOutBufferSize = 0 }; Marshal.StructureToPtr(1u, triggerControl.lpInBuffer, false); NET_DVR_SetDVRConfig(userID, (uint)NET_DVR_SET_TRIGGER_DELAY, 0, ref triggerControl, (uint)Marshal.SizeOf(typeof(NET_DVR_STD_CONTROL))); ``` 在上述代码中,通过调用 HCNetSDK.dll 和 PlayCtrl.dll 中的方法来实现登录相机、设置触发模式和延迟时间的操作。其中,`NET_DVR_SetDVRConfig` 方法用于设置触发延迟参数,`NET_DVR_SetupAlarmChan_V30` 方法用于设置报警通道,`NET_DVR_SetDVRConfig` 方法用于设置当前时间,`NET_DVR_SetDVRConfig` 方法用于设置触发延迟时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值