vb.net - 如何创建主要用于数据库键的系统范围独立通用计数器对象?

标签 vb.net multithreading com vb6 singleton

我想创建/使用一个系统范围内独立的通用“计数器对象”,可以通过 COM 以线程安全的方式调用它。

计数器对象将传递一个 ID 来识别要返回的计数器、处理计数、“持久”计数(偶尔)、具有合理的性能(尽可能快),也许能够每秒进行 1000 次计数或更好( 1mS)并且可以跨进程/进程外访问。当前计数状态必须在对象重新启动/关闭之间保留。

计数器对象很可能是以某种形式的自由线程字典实现的“单例”类型对象,可能包含 10 个计数器(最多可能 50 个)。计数需要单调且一致(即:保证唯一的顺序值)。

每个计数器应该有一些方法,例如重置、递增、递减、设置、清除、删除。作为一种奢侈,我想要一个可变增量(即:“逐步”值)。为了支持线程安全,可能需要某种临界区或互斥调用。它只需要返回一个 long/4byte 有符号整数。

我真的想要一些可以从任何地方调用的东西,包括 VBScript,所以我认为 COM 是我的首选解决方案。

它的主要用途是数据库键。我无法使用 autoinc 或 guid 类型键,并且目前已排除数据库生成的计数系统。

我花了几天时间研究这个问题,并且真的很难找到解决方案。我能找到的最好的是一个自由线程字典对象,可以使用 Motobit 中的 COM+ 实例化它。 - 它似乎提供了所有的“基础知识”,我想我可以为此创建某种形式的包装器。

所以,这是我的问题:

  • 这样的“通用目的”吗? 反对象已经存在?你能指导我吗? (微软做了 做一个名为的 IIS/ASP 对象 'MSWC.Counter' 但这不是 “跨进程”/进程外 组件并且不是线程安全的。 (但如果是的话,就可以了!)

  • 创建此类的最佳方法是什么 一个组件? (我更喜欢VB6 现在,[别问!]但可以在 VB.NET2005 中执行 如果我必须的话)。我没有 使用的技能/知识/工具 其他任何东西。

我迫切需要一个可行的解决方案。我需要具体指导!如果有人能为我编写一些东西,我准备付钱。

更新:

  1. GUID 有什么问题吗? a) 16 字节(如果我幸运的话)(二进制存储),32+字节(如果我不幸运的话)(没有格式化的 ANSI),甚至更糟(64 字节 Unicode)。 b) 我有一个大容量复制应用程序,其中 GUID 太大(与实际行数据相比),并且 c) 索引和插入的开销 d) 我想要一个可读的数字! - 我只需要 4 字节整数,那么为什么不尝试获取它呢?我知道你会说磁盘空间很便宜,但对于我的应用程序来说,成本在于缓慢的插入,并且指南没有帮助(并且我已经尝试/测试过),但如果我有选择,我宁愿不使用。

  2. 自动编号/自动增量是邪恶的:a) 在插入之后才获取值,b) 特定于 session ,c) 很容易在表更改中丢失/搞砸,d) 对多重没有好处表插入,(它不是 MS-SQL Svr)加上我需要在数据库之外使用计数器...

最佳答案

听上去,您想要创建的是一个 ActiveX EXE。它们在自己的进程中运行,但可以通过实例化其中的对象来从任何其他进程访问,就好像它只是另一个 COM 对象一样。它处理将其内部线程与调用它的任何进程的线程同步所需的所有编码(marshal)处理。由于您计划使用的只是整数,因此无需担心线程之间传递的对象的线程安全性。

您很可能可以在该 ActiveX EXE 中使用 MSWC.Counter 对象并让它执行计数器工作。

关于vb.net - 如何创建主要用于数据库键的系统范围独立通用计数器对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2578881/

相关文章:

c# - 使用 SqlBulkCopy 填充非常大的表的最佳方法是什么?

c++ - 从理论上讲,仅在动态分配中使用内存范围的意外重用来同步线程是否(错误地)合法?

c++ - 等待 atomic_bool

c# - Excel 互操作在装有 Office 2007 的机器上工作,但在装有 Office 2010 的机器上失败

c++ - 使用 C++ 从 32 位进程访问 64 位 dll

c# - 良好的 3270 模拟器 (.NET)

vb.net - 在 Excel 中从 VBA 调用 VB.Net

multithreading - 如何在 Clojure 中启动线程?

c++ - 如何通过 COM 变体编码 utf-8 字节串?

mysql - 如何将每个 DataGridView 行插入 MYSQL DB