小编Bit*_*777的帖子

为什么我的Windows服务启动csc.exe实例?

我在C#中编写了一个多线程的Windows服务.出于某种原因,每次生成一个线程时都会启动csc.exe.我怀疑它与线程本身有关,但事实上它是在每个线程的基础上发生的,并且这些线程是短暂的,这使问题非常明显:许多csc.exe进程不断启动和停止.

性能仍然相当不错,但我希望如果我能消除它,它会有所改善.但是,更令我担心的是McAfee正在尝试扫描csc.exe实例并最终杀死该服务,显然当一个实例在扫描中期退出时.我需要商业部署此服务,因此更改McAfee设置不是解决方案.

我假设我的代码中的某些东西正在触发动态编译,但我不确定是什么.其他人遇到这个问题?任何解决它的想法?

更新1:

在根据@sixlettervariables的建议和链接进行进一步研究之后,问题似乎源于XML序列化的实现,如Microsoft的XmlSerializer文档中所示:

为了提高性能,XML序列化基础结构动态生成程序集以序列化和反序列化指定的类型.

Microsoft在同一个文档中进一步说明了优化:

基础结构查找并重用这些程序集.仅当使用以下构造函数时,才会出现此问题:

XmlSerializer.XmlSerializer(类型)

XmlSerializer.XmlSerializer(Type,String)

这似乎表明只要使用了两个指定的构造函数之一,codegen和编译在第一次使用时只会发生一次.但是,我没有从这个优化中受益,因为我正在使用另一种形式的构造函数,具体来说:

public XmlSerializer(Type type,Type [] extraTypes)

进一步阅读,事实证明,这也恰好是我在代码执行时观察到的内存泄漏的可能解释.同样,来自同一个文档:

如果使用任何其他构造函数,则会生成同一程序集的多个版本,并且永远不会卸载,这会导致内存泄漏和性能下降.最简单的解决方案是使用前面提到的两个构造函数之一.否则,您必须将程序集缓存在Hashtable中.

微软建议的两个解决方法对我来说是最后的手段.转到另一种形式的构造函数不是首选(我使用"extratypes"形式来序列化派生类,这是每个Microsoft的文档支持使用),我不确定我喜欢管理缓存的想法用于跨多个线程的程序集.

因此,我有sgen ',并且看到生成的类型序列化程序的组合按预期生成,但是当我的代码执行时,未加载sgen生成的程序集(在Fusion日志查看器和进程监视器中进行观察).我正在探索为什么会这样.

更新2:

当我使用两个"友好的"XmlSerializer构造函数之一时,sgen'd程序集加载正常(参见上面的Update 1).XmlSerializer(Type)例如,当我使用sgen'd程序集加载并且不执行运行时codegen /编译时.但是,当我使用时XmlSerializer(Type, Type[]),程序集不会加载.找不到任何合理的解释.

所以我正在恢复使用其中一个受支持的构造函数和sgen'ing.这种组合消除了我的原始问题(启动csc.exe),以及另一个相关问题(上面的Update 1中提到的XmlSerializer引起的内存泄漏).但是,它确实意味着我必须为派生类型(XmlInclude在基类型上使用)恢复到不太理想的序列化形式,直到框架中的某些更改来解决这种情况.

.net c#

14
推荐指数
1
解决办法
5906
查看次数

Rails - 设计 - 向控制器添加动作

我在设计控制器中添加动作时遇到了一些麻烦.我创建了registrations_controller一个users/像这样的文件夹中命名的控制器:

class Users::RegistrationsController < Devise::RegistrationsController
Run Code Online (Sandbox Code Playgroud)

并且,有我的路线文件:

root to: 'home#index'

devise_for :users
devise_scope :users do
    get 'users/profil/:id', to: 'users/registrations#profil', as: 'profil'
end
Run Code Online (Sandbox Code Playgroud)

我看到以下错误:

Unknown action
Could not find devise mapping for path "/users/profil/1"
This may happen for two reasons: 1) You forgot to wrap your route inside the scope block. For example: devise_scope :user do get "/some/route" => "some_devise_controller" end 2) You are testing a Devise controller bypassing the router.
Run Code Online (Sandbox Code Playgroud)

我的代码出了什么问题?

controller ruby-on-rails devise

5
推荐指数
1
解决办法
3796
查看次数

跨异步WCF REST服务中的线程的上下文

我正在使用202方法创建异步REST API .我必须在WCF(而不是Web API)中实现它,我的计划是生成一个新线程来执行异步工作,同时让WCF操作线程返回202.我遇到的问题是我的一些遗留代码需要在新线程中使用期望OperationContext和HttpContext来存储和检索上下文信息.我知道这两个都是特定于线程的,因此在生成的线程中为null.

我有两个问题:

  1. 有没有安全的方法将OperationContext和/或HttpContext传播到新线程?
  2. 如果我能够修改遗留​​代码以远离OperationContext和HttpContext,是否有推荐的方法在WCF设置中跨线程共享上下文信息?

c# rest wcf multithreading asynchronous

5
推荐指数
1
解决办法
759
查看次数

我可以在DTD中引用外部DTD来获取ELEMENT的结构吗?

我可以定义一个DTD,使其中的元素在外部DTD中定义其结构吗?我的意思是类似下面的内容(这是一个我知道在几个方面无效的例子,但希望能让你知道我在寻找什么):

<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY % MessageHdr-DTD SYSTEM "./messagehdr.dtd">
<!ENTITY % MessageBody-DTD SYSTEM "./messagebody.dtd">
<!ELEMENT Message (MessageHdr, MessageBody)>
<!ELEMENT MessageHdr (MessageHdr-DTD)>
<!ELEMENT MessageBody (MessageBody-DTD)>
Run Code Online (Sandbox Code Playgroud)

这里的尝试是表示Message需要MessageHdr和MessageBody,但这两个元素是在外部引用的DTD中定义的.

xml dtd

4
推荐指数
1
解决办法
492
查看次数

标签 统计

c# ×2

.net ×1

asynchronous ×1

controller ×1

devise ×1

dtd ×1

multithreading ×1

rest ×1

ruby-on-rails ×1

wcf ×1

xml ×1