decimal.Negate(myDecimal)和myDecimal * -1(除了可读性)之间是否有任何差异?
我想使用MiniDumpWriteDump函数来创建一些自定义转储文件(主要是,我想导出包含线程调用堆栈的最少信息量的转储文件),但是我很难定义需要传递的结构回调函数的参数
[StructLayout(LayoutKind.Explicit)]
internal struct MINIDUMP_CALLBACK_OUTPUT
{
[FieldOffset(0)]
public ulong ModuleWriteFlags;
[FieldOffset(0)]
public ulong ThreadWriteFlags;
}
public struct MINIDUMP_CALLBACK_INFORMATION
{
public IntPtr CallbackRoutine;
public IntPtr CallbackParam;
}
public delegate bool MINIDUMP_CALLBACK_ROUTINE(
IntPtr CallBackParam,
MINIDUMP_CALLBACK_INPUT input,
MINIDUMP_CALLBACK_OUTPUT output);
[DllImport("dbghelp.dll")]
public static extern bool MiniDumpWriteDump(IntPtr hProcess, Int32 ProcessId, IntPtr hFile, int DumpType,
IntPtr ExceptionParam, IntPtr UserStreamParam, IntPtr CallStackParam);
Run Code Online (Sandbox Code Playgroud)
电话看起来像这样:
MINIDUMP_CALLBACK_INFORMATION mci;
MINIDUMP_CALLBACK_ROUTINE r = new MINIDUMP_CALLBACK_ROUTINE(MyCallback);
GC.KeepAlive(r);
mci.CallbackRoutine = Marshal.GetFunctionPointerForDelegate(r);
mci.CallbackParam = IntPtr.Zero;
IntPtr structPointer = Marshal.AllocHGlobal(Marshal.SizeOf(mci));
Marshal.StructureToPtr(mci, structPointer, true);
MiniDumpWriteDump(process[0].Handle, process[0].Id,
fs.SafeFileHandle.DangerousGetHandle(), …Run Code Online (Sandbox Code Playgroud) 我想创建委托来访问不同对象的属性而不事先知道它们.
我有以下定义
public delegate T MyMethod<K, T>(K data);
public static MyMethod<K, T> CreatePropertyGetter<K, T>(PropertyInfo property)
{
MethodInfo mi = property.DeclaringType.GetMethod("get_" + property.Name);
return (MyMethod<K, T>)Delegate.CreateDelegate(typeof(MyMethod<K, T>), mi);
}
Run Code Online (Sandbox Code Playgroud)
其中T可以是decimal,string,datetime或int
我有一些初始化代码将根据我的对象的反射属性创建MyMethod委托,如下所示:
foreach (PropertyInfo property in entityType.GetProperties())
{
switch (property.PropertyType.Name)
{
case "System.Decimal":
return CreatePropertyGetter<T, decimal>(property);
case "System.DateTime":
return CreatePropertyGetter<T, DateTime>(property);
case "System.String":
return CreatePropertyGetter<T, DateTime>(property);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法
编辑:
我关注的是性能,因为这些代表会被频繁调用(滴答场景),因此任何强制转换都会降低它的速度.虽然需要更优雅的解决方案,但性能仍然是我主要关注的问题
我在这里发布了关于Code Review的相同问题,所以考虑到那里的响应,我会将其标记为已解决
我有3个主要的处理线程,每个线程都通过Parallel.Foreach对ConcurrentDictionaries的值执行操作.词典的大小从1,000个元素到250,000个元素不等
TaskFactory factory = new TaskFactory();
Task t1 = factory.StartNew(() =>
{
Parallel.ForEach(dict1.Values, item => ProcessItem(item));
});
Task t2 = factory.StartNew(() =>
{
Parallel.ForEach(dict2.Values, item => ProcessItem(item));
});
Task t3 = factory.StartNew(() =>
{
Parallel.ForEach(dict3.Values, item => ProcessItem(item));
});
t1.Wait();
t2.Wait();
t3.Wait();
Run Code Online (Sandbox Code Playgroud)
我比较了这个构造的性能(总执行时间)和刚刚在主线程中运行Parallel.Foreach并且性能提高了很多(执行时间减少了大约5倍)
我的问题是:
编辑:进一步澄清情况:我在WCF服务上模拟客户端调用,每个调用都来自一个单独的线程(任务的原因).我还尝试使用ThreadPool.QueueUserWorkItem而不是Task,没有性能提升.字典中的对象具有20到200个属性(只是小数和字符串),并且没有I/O活动
我通过在BlockingCollection中排队处理请求并在那时处理它们来解决了这个问题
我正在编写一个WCF服务,它接收来自多个模块(DB,其他服务..)的通知,并将它们添加到阻塞集合中,以便在将相关数据发布到客户端的消费者线程上进行处理.
客户端可以请求存储在服务器上的完整数据,在此操作期间,我不想接受任何新通知.基本上我想暂停阻塞集合(或消费者线程)并在完成客户端请求后恢复通知接收和处理.
实现此行为的好方法是什么?
c# ×5
.net ×4
decimal ×1
delegates ×1
dllimport ×1
generics ×1
minidump ×1
negate ×1
performance ×1
properties ×1