小编anc*_*dra的帖子

.NET decimal.Negate vs乘以-1

decimal.Negate(myDecimal)myDecimal * -1(除了可读性)之间是否有任何差异?

.net c# decimal negate

9
推荐指数
2
解决办法
1760
查看次数

使用回调调用MiniDumpWriteDump

我想使用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)

.net c# minidump dllimport

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

实例化通用委托和访问属性getter的最佳实践

我想创建委托来访问不同对象的属性而不事先知道它们.

我有以下定义

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)

有没有更好的方法

  1. 创建属性getter?
  2. 通过支持的属性类型枚举硬编码为字符串?

编辑:

我关注的是性能,因为这些代表会被频繁调用(滴答场景),因此任何强制转换都会降低它的速度.虽然需要更优雅的解决方案,但性能仍然是我主要关注的问题

我在这里发布了关于Code Review的相同问题,所以考虑到那里的响应,我会将其标记为已解决

.net c# generics delegates properties

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

在几个线程上运行Parallel.Foreach的性能

我有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倍)

我的问题是:

  1. 上面的方法有问题吗?如果是,那么改进的内容和方式如何?
  2. 执行时间不同的原因是什么?
  3. 调试/分析这种情况的好方法是什么?

编辑:进一步澄清情况:我在WCF服务上模拟客户端调用,每个调用都来自一个单独的线程(任务的原因).我还尝试使用ThreadPool.QueueUserWorkItem而不是Task,没有性能提升.字典中的对象具有20到200个属性(只是小数和字符串),并且没有I/O活动

我通过在BlockingCollection中排队处理请求并在那时处理它们来解决了这个问题

.net c# parallel-processing performance

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

如何实现可挂起的BlockingCollection

我正在编写一个WCF服务,它接收来自多个模块(DB,其他服务..)的通知,并将它们添加到阻塞集合中,以便在将相关数据发布到客户端的消费者线程上进行处理.

客户端可以请求存储在服务器上的完整数据,在此操作期间,我不想接受任何新通知.基本上我想暂停阻塞集合(或消费者线程)并在完成客户端请求后恢复通知接收和处理.

实现此行为的好方法是什么?

c# task-parallel-library

3
推荐指数
1
解决办法
2129
查看次数