这个问题的两个部分:
我们有一个在.Net 4上运行的混合模式汇编应用程序(MFC + WinForms),Windows 2008 R2在一个线程上不断使用100%cpu.
使用ProcessExplorer,我们在忙线程上看到以下堆栈.我们还可以看到另外10个线程只使用0.01%的CPU运行clr.dll!StrongNameSignatureVerification.
旋转线程不会阻止应用程序的其余部分运行,但会浪费CPU时间.
繁忙线程的堆栈跟踪如下:
ntoskrnl.exe!IoAcquireRemoveLockEx+0xe7
ntoskrnl.exe!memset+0x22a
ntoskrnl.exe!KeWaitForSingleObject+0x2cb
ntoskrnl.exe!KeDetachProcess+0x120d
ntoskrnl.exe!PsReturnProcessNonPagedPoolQuota+0x3a3
ntoskrnl.exe!CcSetDirtyPinnedData+0x433
mscorlib.ni.dll+0x2b066a
mscorlib.ni.dll+0x2317ac
mscorlib.ni.dll+0x2b066a
mscorlib.ni.dll+0x2317ac
mscorlib.ni.dll+0x26ccf7
mscorlib.ni.dll+0x237fc4
mscorlib.ni.dll+0x26cc3c
clr.dll+0x21bb
clr.dll!CoUninitializeEE+0xee9b
clr.dll!CoUninitializeEE+0x11463
clr.dll!CoUninitializeEE+0x114dc
clr.dll!CoUninitializeEE+0x1154b
clr.dll!StrongNameErrorInfo+0xa638
clr.dll!StrongNameSignatureVerification+0x144fb
clr.dll!StrongNameSignatureVerification+0x1457d
clr.dll!StrongNameSignatureVerification+0x14638
clr.dll!StrongNameSignatureVerification+0x146d2
clr.dll!StrongNameErrorInfo+0x9977
clr.dll!StrongNameErrorInfo+0xa5bc
clr.dll!StrongNameErrorInfo+0xa553
clr.dll!StrongNameErrorInfo+0xa517
clr.dll!StrongNameErrorInfo+0xa151
clr.dll!StrongNameErrorInfo+0x9501
clr.dll!StrongNameErrorInfo+0xad67
clr.dll!StrongNameSignatureVerification+0x164d9
ntdll.dll!RtlCreateUserProcess+0x8c
ntdll.dll!RtlCreateProcessParameters+0x4e
Run Code Online (Sandbox Code Playgroud)
我能找到的唯一类似帐户就是这个问题:clr.sll!StrongNameSignature验证CPU耗尽虽然线程似乎已经冷了.
我们不签署我们的程序集并且愿意信任它们,有没有办法完全禁用强名称验证?
我试图使用CountdownEvent只允许线程在事件的计数为零时继续,但我希望初始计数为零.实际上,我希望返回到零行为,每当计数为零时,就会发出事件信号,并且只要线程大于零,就会使线程等待.
我可以使用0初始计数初始化Countdown事件,但是当我尝试添加到计数时,我得到InvalidOperationException "CountdownEvent_Increment_AlreadyZero".
是否有替代类或其他方式我可以使用倒计时事件以避免此限制?
C#堆栈跟踪采用以下形式:
at Foo.Core.Test.FinalMethod(Doh doh) in C:\Projects\src\Core.Tests\Test.cs:line 21
at Foo.Core.Test.AnotherMethod(Bar bar)
at Foo.Core.Test.AMethod() in C:\Projects\src\Core.Tests\Test.cs:line 6
at Foo.Core.Test.<>c__DisplayClass7.<SomeAnonDelegate>b__6(Object _) in C:\Projects\src\Core.Tests\Test.cs:line 35
Run Code Online (Sandbox Code Playgroud)
如何从每一行检索命名空间,类,方法,文件和行号?
会欣赏一些想法和意见.
现代垃圾收集器(如在CLR,JVM中)使用什么技术来判断哪些堆对象是从堆栈引用的?
具体来说,VM如何从知道堆栈开始的位置解释所有对堆对象的本地引用?
我想使用Reactive Extensions转换一些消息,并在一小段延迟后转发它们.
消息看起来像这样:
class InMsg
{
int GroupId { get; set; }
int Delay { get; set; }
string Content { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
输出看起来像这样:
class OutMsg
{
int GroupId { get; set; }
string Content { get; set; }
OutMsg(InMsg in)
{
GroupId = in.GroupId;
Content = Transform(in.Content); // function omitted
}
}
Run Code Online (Sandbox Code Playgroud)
有几个要求:
给定一个Observable <InMsg>和一个Send函数:
IObservable<InMsg> inMsgs = ...;
void Send(OutMsg o)
{
... // publishes transformed messages
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用Select来执行转换.
void SetUp()
{
inMsgs.Select(i …Run Code Online (Sandbox Code Playgroud) 是否有任何C#计算引擎可以在值更改时自动重新计算相关字段?
让我自由泳一秒钟,我想象这样的事情..
Field<double> quantity = Field.Create<double>("Quantity");
Field<double> unitCost = Field.Create<double>("Unit Cost");
Field<double> total = Field.Create<double>("Total");
total.Calculation((q,uc) => q * uc, quantity, value);
// would have signature something like this:
// void Calculation<TR,T1,T1>(Func<TR,T1,T2>, Field<T1>, Field<T2>)
Run Code Online (Sandbox Code Playgroud)
这将设置自动传播依赖值的字段.
quantity.Value = 5.0;
unitCost.Value = 1.5;
Assert.That(total.Value, Is.EqualTo(7.5));
Run Code Online (Sandbox Code Playgroud)
显然这是一个简单的例子,最终用途更类似于复杂电子表格的计算.
进一步思考,如果字段/单元格支持更改通知,那将是惊人的.
JVM执行一个称为锁定省略的巧妙技巧,以避免锁定仅对一个线程可见的对象的成本.
这里有一个很好的描述:
http://www.ibm.com/developerworks/java/library/j-jtp10185/
.Net CLR是否有类似的功能?如果不是那么为什么不呢?
我有一个应用程序,从单词go经历缓慢的内存泄漏.
使用ANTS Memory Profiler我可以看到所有泄漏的内存都由终结器队列的GC根保存.
我怀疑可能发生的事情是终结器已经死锁,等待锁定变为可用.
我们的类都没有实现显式终结器,我们通常会避免使用它们,这使我认为锁可能与系统或库类有关.
我曾经看过SOS.dll终结器队列的内容,如果我正确解释它然后它报告第一个项目是一个实例System.Threading.Thread 但是我不确定队列的头部是否实际代表当前正在处理的对象或下一个待处理的对象.
更新
终结器线程的堆栈如下所示:
ntdll.dll!_ZwWaitForSingleObject@12() + 0x15 bytes
ntdll.dll!_ZwWaitForSingleObject@12() + 0x15 bytes
user32.dll!_NtUserPostMessage@16() + 0x15 bytes
kernel32.dll!_WaitForSingleObjectExImplementation@12() + 0x43 bytes
kernel32.dll!_WaitForSingleObject@8() + 0x12 bytes
ole32.dll!GetToSTA() + 0x72 bytes
ole32.dll!CRpcChannelBuffer::SwitchAptAndDispatchCall() - 0x1939 bytes
ole32.dll!CRpcChannelBuffer::SendReceive2() + 0xa6 bytes
ole32.dll!CAptRpcChnl::SendReceive() + 0x5b7 bytes
ole32.dll!CCtxComChnl::SendReceive() - 0x14b97 bytes
ole32.dll!NdrExtpProxySendReceive() + 0x43 bytes
rpcrt4.dll!@NdrpProxySendReceive@4() + 0xe bytes
rpcrt4.dll!_NdrClientCall2() + 0x144 bytes
ole32.dll!_ObjectStublessClient@8() + 0x7a bytes
ole32.dll!_ObjectStubless@0() + 0xf bytes
ole32.dll!CObjectContext::InternalContextCallback() …Run Code Online (Sandbox Code Playgroud) 也许我只是愚蠢但你何时以及为什么要使用:
NUnit.Framework.Assert.That<T>(ref T, NUnit.Framework.Constraints.IResolveConstraint, string, params object[])
NUnit.Framework.Assert.That<T>(ref T, NUnit.Framework.Constraints.IResolveConstraint, string)
NUnit.Framework.Assert.That<T>(ref T, NUnit.Framework.Constraints.IResolveConstraint)
Run Code Online (Sandbox Code Playgroud)
取代:
NUnit.Framework.Assert.That(object, NUnit.Framework.Constraints.IResolveConstraint, string, params object[])
NUnit.Framework.Assert.That(object, NUnit.Framework.Constraints.IResolveConstraint, string)
NUnit.Framework.Assert.That(object, NUnit.Framework.Constraints.IResolveConstraint)
Run Code Online (Sandbox Code Playgroud)
通过ref传递给这些方法有什么好处?
c# ×5
.net ×4
clr ×2
cpu-usage ×1
database ×1
file-format ×1
finalizer ×1
java ×1
jvm ×1
locking ×1
nunit ×1
parsing ×1
propagation ×1
regex ×1
stack ×1
stack-trace ×1
strongname ×1