如何避免一遍又一遍地创建同一个对象?

2024-03-02

如前所述,我继续研究我的 TCP 套接字今天早上 https://stackoverflow.com/questions/74812333.

我发现每次我通过这样的套接字发送消息时,套接字的数量都会不断增加。这仅仅意味着我不断创建和打开新的套接字,而不是重新使用已经打开的套接字。

在我的应用程序中,我有一个连接存储库,我只需要使用其中一个。但我担心我会不断地创造新的。这是它的完成方式:

public static class Repository
{
  ...
  public static Conn GetByName(string name, ...)
  {
    return result = 
      context.Set<Conn>().Where(o => o.Name == name).FirstOrDefault();
  }
}

...
Conn Connection_For_Message = Repository.GetByName(request.ConnectionName, ...);

据我说:

  1. 事实是Repository被宣布static导致在内部创建一个对象。
  2. As the GetByName()方法执行FirstOrDefault() of a Where()方法,这是给出已经存在的对象,并且它不会创建新的对象。

现在我的印象是 1. 是正确的,但 2. 是错误的,因为Connection Connection_For_Message always创建对象的新实例。

我的印象是否正确?如果是,我该如何解决这个问题?我正在考虑改变Repository从静态类变成单例,但我没有找到ISingleton或某些东西System.Reflection,还是我看错了方向?

Edit:特此构造函数的一部分Conn class:

public Conn(...)
{
    ...
    TcpConnection = new TcpConnection(...); // in here a 
    ...
}

TcpConnection类涉及:

public class TcpConnection : IDisposable
{
    public Socket _socket;
    ...

每次发消息都会经过GetByName()方法和我的调用堆栈如下所示:

  My_Application.dll!TcpConnection.TcpConnection(...) Line 39   C#
> My_Application.dll!Conn.Conn(...) Line 32 C#
  [External Code]   
  My_Application.dll!ConnectionRepository.GetByName(string name, ...) Line 71   C#

该行,标记为>是构造函数,这确实证明了GetByName()正在呼叫Conn确实是构造函数。 (哦,为什么之间有“外部代码”GetByName()方法和构造函数?)

再次编辑:我已成功显示外部代码,因此选中了“显示外部代码”的调用堆栈:

>  My_Application.dll!TcpConnection.TcpConnection(...) Line 39  C#
   My_Application.dll!Conn.Conn(...) Line 32    C#
   [Native to Managed Transition]   
   [Managed to Native Transition]   
   System.Private.CoreLib.dll!System.Reflection.RuntimeConstructorInfo.Invoke(System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object[] parameters, System.Globalization.CultureInfo culture)    C#
   System.Private.CoreLib.dll!System.RuntimeType.CreateInstanceImpl(System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, object[] args, System.Globalization.CultureInfo culture)   C#
   System.Private.CoreLib.dll!System.Activator.CreateInstance(System.Type type, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, object[] args, System.Globalization.CultureInfo culture, object[] activationAttributes)    C#
   Castle.Core.dll!Castle.DynamicProxy.ProxyGenerator.CreateClassProxyInstance(System.Type proxyType, System.Collections.Generic.List<object> proxyArguments, System.Type classToProxy, object[] constructorArguments)  C#
   [Lightweight Function]   
   Microsoft.EntityFrameworkCore.Relational.dll!Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable<Conn>.Enumerator.MoveNext()   C#
   System.Linq.dll!System.Linq.Enumerable.TryGetSingle<Conn>(System.Collections.Generic.IEnumerable<Conn> source, out bool found)   C#
   [Lightweight Function]   
   System.Linq.Queryable.dll!System.Linq.Queryable.FirstOrDefault<Conn>(System.Linq.IQueryable<Conn> source)    C#
   My_Application.dll!ConnectionRepository.GetByName(string name, ...) Line 71  C#

您正在使用实体框架查询数据库以获取 Conn(正如我们从调用堆栈中看到的那样)。数据库当然不能存储TCP连接之类的东西。每次执行查询时,都会返回 Conn 的新实例(从技术上讲,它可以从缓存返回,但不会改变情况),尽管它代表相同的数据库行。在代表数据库条目的类的构造函数中创建 TCP 客户端并不是一个好主意。

相反,你可以使用ConcurrentDictionary<string, TcpConnection>以线程安全的方式管理您的连接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免一遍又一遍地创建同一个对象? 的相关文章

  • 为什么使用abs()或fabs()而不是条件否定?

    在 C C 中 为什么要使用abs or fabs 不使用以下代码即可查找变量的绝对值 int absoluteValue value lt 0 value value 这与较低级别的指令较少有关吗 您提出的 有条件的abs 并不等于std
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据

随机推荐

  • Perl-我在寻找什么功能?将多个规则分配给指定结果

    我在脑海中概念化了一个函数 我想象它存在 但如果它存在 我不知道它的名字 因此很难用谷歌搜索 假设我想定义两个结果 我将称之为Pass and Fail 我想要几个不同的规则适用于这两种结果 因此 为了清楚起见 希望如此 假设我有一个文件
  • 在 Three.js 中,Alpha 通道工作不一致

    我正在用 Three js 构建一个 剪纸 世界 我的所有模型都是简单的 平面 我使用带有 Alpha 通道的 PNG 来对它们进行纹理处理 以将平面修剪成更令人愉悦的形状 奇怪的是 根据飞机的位置和相机的位置 透明度不可预测地出现和消失
  • 检查数据帧是否包含任何空值

    我有一个数据框 需要查看它是否包含空值 关于同一主题的帖子有很多 但几乎所有帖子都使用count行动或show方法 count在我的例子中 由于数据量很大 操作的成本非常高 同样对于show method 有没有一种方法可以让 Spark
  • 在类中使用 PDO [重复]

    这个问题在这里已经有答案了 我有一些类执行一些 MySQL 查询和准备好的语句 然而 我不知道如何将我的 PDO 对象合并到这些类中 例如 我想做这样的事情 不幸的是 它不起作用 谁能建议一种优雅的方法来做到这一点 谢谢你的时间 抱歉 我是
  • 动态组装scrapy GET请求字符串

    我一直在使用 firebug 并且有以下字典来查询 api url htp my url aspx top querystring dbkey x1 stype id s 27 headers accept text html applic
  • qt webengine将javascript输出重定向到GUI

    我有一个可以查看页面的应用程序QWebEngineView小部件如何将我的 javascript 控制台日志重定向到我的 GUI 它当前显示在我的调试输出中 您必须子类化 QWebEnginePage 才能覆盖 javaScriptCons
  • 使用immulator时在android studio中使用protocol=http/1.1、code=200在Retrofit中获取F响应

    我正在从 Nodejs 本地服务器调用 API API正在调用 但Retrofit的respose body中没有数据 代码 200 和消息 OK 我收到以下回复 Response protocol http 1 1 code 200 me
  • FlexSlider 2 标题在 chrome 上闪烁

    我在 chrome 上的标题有些闪烁 http tyni cc flexsliderissue http tyni cc flexsliderissue在野生动物园中一切都运行良好 任何人都知道出了什么问题吗 谢谢 丹尼尔 我经常使用 Fl
  • React hooks - 当状态更改为相同值时如何强制 useEffect 运行?

    所以我正在构建一个鼓垫类型的应用程序 除了这个之外 几乎所有东西都可以正常工作 编辑 把整个东西放在codesandbox上 如果有人想看的话 codesandbox io s sleepy darwin jc9b5 file src Ap
  • 连接到存储在 Azure VM 上的 Nexus 3 Preview 上的 Docker 注册表时出现问题

    基本上 我在连接到我尝试使用最新的 Nexus 预览版创建的 docker 注册表时遇到了问题 首先 我在运行 Ubuntu 14 04 trusty 的 MS Azure 云服务器上安装了 Sonotype Nexus 3 Preview
  • 如何在 PHP 中使用 UTF-8 支持替换所有非字母字符

    我想从字符串中删除所有非字母字符 问题是我不知道字母范围 因为它是 UTF8 字符串 可以是英语 我通常会做这样的事情 str preg replace a zA Z str or str preg replace w u str 但它们都
  • CSS 打印预览 - 显示图像/链接 URL

    我正在创建一个打印样式表 并且希望通过在链接和图像旁边显示链接 URL 来使网站尽可能易于访问 对于简单的链接我找到了这个解决方案 http davidwalsh name optimize your links for print usi
  • 如何在 Android 手机上签署“.apk”文件?

    我想在手机上生成一个新的 apk 文件 我的应用程序市场中的一个功能 如应用程序 我必须在安装它之前对其进行签名 我想我必须在手机上运行 JarSigner JarSigner 存在于以下两个项目中 OpenJDK 和 GCC libjav
  • 使 clos 对象可在 lisp 中打印

    如果你想让 common lisp 中的 CLOS 对象可打印 可读打印 你如何在不使用除了 print 和 read 之外的任何东西的情况下做到这一点 至少在我的解决方案中 有两个部分可以做到这一点 但是您将需要这个功能 感谢 cl pr
  • Django API 请求

    我正在尝试使用模型的字段作为 API 请求中的关键字来访问另一个服务的 API URL 会像这样 http api example com json first name FNAME last name LNAME key key 这是我的
  • 使用 sed 计算反向引用

    我想 pm max children 5 成为 pm max children 8 并一直在努力但没有得到解决方案 像 1 或 2 这样的反向引用似乎不适用于计算 sed i E s pm max children s 1 echo 2 3
  • 这个字符串是什么:Ôªø 以及如何避免它?

    不知何故 我设法将 放在 PHP 脚本的顶部 那群可怕的人物到底是什么 我怎么可能进入其中 以及将来我该如何揭露和 或避免它 有趣的是 它之前潜伏在 PHP 脚本的最顶部
  • Cloudera 5.1下作业在LocalJobRunner中保持运行

    需要一些快速帮助 我们的作业在 MapR 下运行良好 但是当我们在 Cloudera 5 1 上启动相同的作业时 它继续以本地模式运行 我确信这是某种配置问题 它是哪个配置设置 14 08 22 12 16 58 INFO mapreduc
  • C# 通用字典 TryGetValue 找不到键

    我有这个简单的例子 using System using System Collections Generic namespace ConsoleApplication1 class Program static void Main str
  • 如何避免一遍又一遍地创建同一个对象?

    如前所述 我继续研究我的 TCP 套接字今天早上 https stackoverflow com questions 74812333 我发现每次我通过这样的套接字发送消息时 套接字的数量都会不断增加 这仅仅意味着我不断创建和打开新的套接字