小编use*_*275的帖子

使用WCF(.NET)进行进程内通信设计

我有一个有趣的设计问题,我希望你们都能提出一些建议.我正在使用C#和.NET 3.0

我有一个非常好的,可扩展的框架构建在WCF之上,可以自动设置端点和创建合同.我正在使用的系统可以以不同的方式运行 - 端点可以在互联网上的其他位置,在同一个盒子上的不同程序集中运行,甚至可以在相同的进程中运行.WCF非常适合所有这些透明,但在最后一种情况下,我想提高效率:

我希望避免序列化那些实际上并不存在的对象的开销.这样做在同一个程序集中的两个线程之间进行通信真的没有意义.同时,我想利用已经存在的基于WCF的框架,因为如果根据系统的设置没有两个独立的通信路径,它将更容易维护.

我的第一个想法是在不安全的上下文中使用对象指针 - 不对抗序列化,而是仅序列化最小量.我对此的关注是,在GC处于攻击性的环境中的异步消息上,在我们有机会取消引用其中包含的指针之前,该消息可能也可能会消失,这将导致很多问题.

我的下一个想法是使用GCHandles,但我不确定他们的行为 - 如果GCHandle不再被引用,但包含对托管对象的引用,是否由GC清理,或者两者都没有?我担心通过使用这些来引入大量内存泄漏,因为消息丢失的可能性很大,我们将无法调用Free(),我可以找到的文档是......缺乏.

另一个想法是使用反射来查看所有托管对象,但看起来这样的开销很大,而且这个系统必须尽可能高效.

因此,总而言之,我正在尝试使用WCF在一个进程中发送一个对象而不对其进行序列化,据我所知,这意味着即使它暂时没有引用也要保持它.看起来它应该是可能的,但是我想知道我是不是想吃蛋糕而且也吃它.

非常感谢您的投入!

wcf garbage-collection communication reference

6
推荐指数
2
解决办法
2878
查看次数

CompiledQuery与Plain Linq SQL生成

所以我正在对我的SQLServer数据库的不同方法进行一些分析.我做了vanilla TSQL,CompiledQuery和一个未编译的Linq语句.

正如预期的那样,性能按照相同的顺序进行,但是在分析后两者时我发现了一些好奇的东西.

CompiledQuery生成的SQL比普通旧语句生成的SQL要好得多.

本地SQLExpress数据库; table被称为'foreignTable',ColumnA是int,主键(索引); ColumnB是随机int.

Func<testingDatabaseEntities1, int, int> GetByPK = CompiledQuery.Compile((testingDatabaseEntities1 ft, int key) 
  => (ft.foreignTable.Where(x => x.ColumnA == key).FirstOrDefault().ColumnB));
Run Code Online (Sandbox Code Playgroud)

生成

SELECT 
[Project1].[ColumnB] AS [ColumnB]
FROM   ( SELECT cast(1 as bit) AS X ) AS [SingleRowTable1]
LEFT OUTER JOIN  (SELECT TOP (1) 
    [Extent1].[ColumnB] AS [ColumnB]
    FROM [dbo].[foreignTable] AS [Extent1]
    WHERE [Extent1].[ColumnA] = @p__linq__1 ) AS [Project1] ON 1 = 1
Run Code Online (Sandbox Code Playgroud)

对于生成的代码,这真的不是可怕了.

但是当我做普通的Linq声明时:

entity.foreignTable.Where(x => x.ColumnA == searchForMe).FirstOrDefault().ColumnB
Run Code Online (Sandbox Code Playgroud)

它产生:

SELECT 
[Limit1].[C1] AS [C1], 
[Limit1].[ColumnA] AS [ColumnA], 
[Limit1].[ColumnB] …
Run Code Online (Sandbox Code Playgroud)

c# linq-to-entities entity-framework

2
推荐指数
1
解决办法
2034
查看次数