小编Mic*_*ael的帖子

如何在使用EPPlus时设置列类型

我正在使用DAL EPPlus生成Excel文件,我正在DataTable填充,将数据填充到表中,并将表传递给表示层.从那里我正在使用LoadFromDataTable()方法来生成Excel文件.

一切正常,除了我想要将列的类型之一设置为Date.我试图把我的列类型DataTable,以Date比传递DataTable到表现层,但它似乎EPPlus要么,忽略了它,或者不承认,因为当我打开生成的Excel文件,细胞的类型Number.

如果我手动格式化单元格并将类型设置为Date,则Excel显示正确的日期.那我该怎么做呢?

epplus

63
推荐指数
3
解决办法
5万
查看次数

为什么事件处理程序会阻止垃圾收集器的发生

我有这段代码

public class Publisher
{
    public event EventHandler SomeEvent;
}

public class Subscriber
{
    public static int Count;

    public Subscriber(Publisher publisher)
    {
        publisher.SomeEvent += new EventHandler(publisher_SomeEvent);
    }

    ~Subscriber()
    {
        Subscriber.Count++;
    }

    private void publisher_SomeEvent(object sender, EventArgs e)
    {
        // TODO
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序的主要方法中我有

static void Main(string[] args)
{
    Publisher publisher = new Publisher();

    for (int i = 0; i < 10; i++)
    {
        Subscriber subscriber = new Subscriber(publisher);
        subscriber = null;
    }

    GC.Collect();
    GC.WaitForPendingFinalizers();

    Console.WriteLine(Subscriber.Count.ToString());
}
Run Code Online (Sandbox Code Playgroud)

如果我运行它,我将输出0.如果我从代码中删除事件订阅,我将得到期望的结果 - 这是10.

当 …

c# events garbage-collection finalizer

8
推荐指数
1
解决办法
2329
查看次数

保留的内存可能导致Out of memory异常

我们有一个泄漏内存的32位Windows服务 - 抛出OutOfMemory异常.它是在Windows Server 2003上运行的.net 4.0可执行文件.在使用WinDbg调试崩溃转储文件时,我看到大部分内存实际上是保留的而不是提交的. 在此输入图像描述

从WinDbg屏幕截图中可以看出,存在2.5 Gb的未分类内存使用情况,其中大部分2.1 Gb实际上是保留内存(MEM_RESERVE).我有调试压缩转储的经验,但这种情况对我来说是新的.MEM_COMMIT退出OK - 564.270 Mb,托管堆的大小为82 Mb

在此输入图像描述

我还查看了原生堆,看看是否保留了大块数据,但也找不到任何可疑的东西

在此输入图像描述

所以我的问题是 - MEM_RESERVED可能导致OOM异常吗?如果是这样,我该如何调试它,看看为什么/如何保留大量的内存?你还能在哪里找到可能存在的问题?

如果需要任何其他信息,请索取,我将更新我的帖子.

.net memory memory-management windbg out-of-memory

8
推荐指数
1
解决办法
608
查看次数

多对多索引创建约定

我的问题与这篇 SO post相关,但我不想阻止,而是想了解创建索引的约定是什么,因为我找不到任何东西。

给定实体:

public class Entity1
{
  public Guid Id {get;set;}
  public string Name {get;set;}
  public ICollection<Entity1Entity2Link> Links {get;set;}
}

public class Entity2
{
  public Guid Id {get;set;}
  public string Name {get;set;}
  public ICollection<Entity1Entity2Link> Links {get;set;}
}

public class Entity1Entity2Link
{
  public Guid Entity1Id {get;set;}
  public Entity1 Entity1 {get;set;}

  public Guid Entity2Id {get;set;}
  public Entity2 Entity2 {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

以及多对多关系设置:

modelBuilder
                .Entity<Entity1Entity2Link>()
                .HasKey(ofl => new
                {
                    ofl.Entity1Id ,
                    ofl.Entity2Id 
                });

            modelBuilder
                .Entity<Entity1Entity2Link>()
                .HasOne(ofl => ofl.Entity1)
                .WithMany(e => e.Links)
                .HasForeignKey(ofl …
Run Code Online (Sandbox Code Playgroud)

entity-framework-core

8
推荐指数
1
解决办法
793
查看次数

Repeater控件没有公共属性ModelType

我正在尝试使用asp.net 4.5的模型绑定功能.我正在使用Repeater控件,在其上设置ModelType属性,但是一旦我运行应用程序,我就会收到解析器错误,其中指出Repeater没有ModelType公共属性.这是标记

<ul>
    <asp:Repeater ID="rptDepartments" runat="server" ModelType="TestWebApp.Models.Department">
        <ItemTemplate>
            <li>
                <%#: Item.DeptName %>
            </li>
        </ItemTemplate>
    </asp:Repeater>
    </ul>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗 ?我看到了大量使用模型绑定与网络中的转发器控制相结合的示例.

我正在使用VS 2012 RC.

asp.net-4.5

7
推荐指数
1
解决办法
2455
查看次数

如何使用 StreamReader.ReadAsync(Memory&lt;Char&gt;, CancellationToken)

我正在尝试使用StreamReader.ReadAsync(Memory, CancellationToken) 重载,它接受Memory<T>. 这是示例代码:(.NET Core 2.1)

static async Task Main(string[] args)
{
    string code = "Hello, World";
    var memoryStream = Encoding.UTF8.GetBytes(code.ToCharArray(), 0, code.Length);
    using (var stream = new MemoryStream(memoryStream))
    using (var reader = new StreamReader(stream))
    {
        // var text = await reader.ReadLineAsync();
        // Console.WriteLine(text); -> Outputs: Hello, World

        Memory<char> memory = new Memory<char>();
        await reader.ReadAsync(memory);

        Console.WriteLine("Memory<char> length:" + memory.Length);
    }

}
Run Code Online (Sandbox Code Playgroud)

代码尝试读取字符串内容StreamReader并填充Memory<char>。但是,代码的Memory<char>长度一直输出 0 。

使用此方法填充的正确方法是Memory<char>什么?

我的.csproj文件内容: …

c# .net-core

6
推荐指数
1
解决办法
3330
查看次数

c#如何区分实例方法和虚方法

所以基本上我想了解C#编译器用来确定被调用的方法是非虚拟实例方法还是虚方法的一般步骤.

混淆来自这两个解释(CLR通过C#第3版,Jeffrey Richter,第4章类型基础)

调用非虚拟实例方法时,JIT编译器将查找与用于进行调用的变量类型对应的类型对​​象

对于虚方法调用

在调用虚拟实例方法时,JIT编译器会在方法中生成一些额外的代码,每次调用该方法时都会执行该代码.此代码将首先查看用于进行调用的变量,然后将地址跟随调用对象

我创建了小型测试项目

class Program
    {
        static void Main(string[] args)
        {
            Parent p = new Derived();
            p.Foo(10); // Outputs Derived.Foo(int x)

            Derived d = new Derived();
            d.Foo(10); // Outputs Derived.Foo(double y)
        }
    }

    internal class Parent
    {
        public virtual void Foo(int x)
        {
            Console.WriteLine("Parent.Foo(int x");
        }
    }

    internal class Derived: Parent
    {
        public override void Foo(int x)
        {
            Console.WriteLine("Derived.Foo(int x)");
        }

        public void Foo(double y)
        {
            Console.WriteLine("Derived.Foo(double y)");
        }
    }
Run Code Online (Sandbox Code Playgroud)

虽然Jon Skeet有一篇博客文章解释了为什么程序会产生这些输出,而Eric Lippert在他的博客文章 …

.net c# clr virtual-functions

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

nuget 包重定向后无法加载文件或程序集“System.Runtime.InteropServices.RuntimeInformation”

关于此错误有很多类似的帖子,不幸的是它们都没有帮助。

我已将解决方案项目升级到 .NET 4.8,然后发出命令来重新定位 nuget 包

update-package -reinstall -ignoreDependencies

此后,单元测试失败并出现错误:

消息:System.IO.FileNotFoundException:无法加载文件或程序集“System.Runtime.InteropServices.RuntimeInformation,Version=4.0.2.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。该系统找不到指定的文件。---- System.IO.FileNotFoundException:无法加载文件或程序集“System.Runtime.InteropServices.RuntimeInformation,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。该系统找不到指定的文件

融合日志输出如下:

*** Assembly Binder Log Entry  (7/24/2019 @ 2:20:44 PM) ***

The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable  C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2019\PROFESSIONAL\COMMON7\IDE\EXTENSIONS\TESTPLATFORM\testhost.x86.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = System.Runtime.InteropServices.RuntimeInformation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 (Fully-specified)
LOG: Appbase = file:///C:/sources/Services/upgrade-net48/ProSynchronizationWorker.Tests/bin/Debug
LOG: Initial PrivatePath = …
Run Code Online (Sandbox Code Playgroud)

.net c# xunit

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

TPL Dataflow - 非常快的生产者,没有那么快的消费者OutOfMemory异常

在将TPL Dataflow移植到我的生产代码之前,我正在尝试使用它.生产代码是传统的生产者/消费者系统 - 生产者生成消息(与金融领域相关),消费者处理这些消息.

我感兴趣的是,如果在某些时候生产者的生产速度比消费者能够处理它的速度快得多(系统会爆炸,或者会发生什么),那么环境将会保持稳定,更重要的是在这些情况下该怎么做.

因此,为了尝试类似的简单应用程序,我想出了以下内容.

    var bufferBlock = new BufferBlock<Item>();

    var executiondataflowBlockOptions = new ExecutionDataflowBlockOptions
                        {
                            MaxDegreeOfParallelism = Environment.ProcessorCount
                            ,
                            BoundedCapacity = 100000
                        };

        var dataFlowLinkOptions = new DataflowLinkOptions
                        {
                            PropagateCompletion = true
                        };

        var actionBlock1 = new ActionBlock<Item>(t => ProcessItem(t),
 executiondataflowBlockOptions);

            bufferBlock.LinkTo(actionBlock1, dataFlowLinkOptions);
            for (int i = 0; i < int.MaxValue; i++)
            {
                 bufferBlock.SendAsync(GenerateItem());
            }

            bufferBlock.Complete();
            Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

Item 是一个非常简单的课程

internal class Item
    {
        public Item(string itemId)
        {
            ItemId = itemId;
        }

        public string ItemId { get; }
    } …
Run Code Online (Sandbox Code Playgroud)

.net c# producer-consumer tpl-dataflow

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

以取消状态结束的等待任务不会抛出

阅读Stephen Toub 所著的基于任务的异步模式我试图了解任务取消是如何工作的。在Await使用基于任务的异步模式部分中,在第 3 段中表示:

如果等待的Task 或Task TResult> 以Canceled 状态结束,则会抛出OperationCanceledException。

我试图在下面的代码中看到它的实际效果。

static void Main(string[] args)
{
   CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
   CancellationToken cancellationToken = cancellationTokenSource.Token;

   Task<int> valueTask = DoStuffAsync(cancellationToken);
   Thread.Sleep(TimeSpan.FromSeconds(1));
   cancellationTokenSource.Cancel();

   Console.WriteLine("value task's status: {0}", valueTask.Status); 
   Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

以及DoStuffAsync()方法

static async Task<int> DoStuffAsync(CancellationToken cancellationToken)
{
    await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

执行此代码不会引发任何异常,它只会打印:

值任务的状态:已取消

现在,我的期望是在DoStuffAsync()方法中,因为await Task.Delay(...)被取消了,我们已经等待任务以取消状态结束,因此应该抛出异常(根据 TAP 文档的引用),但是如果我放置一个断点Console.ReadLine()并检查valueTask它的状态是否已取消,例外是null

如果我误读了文档,或者我提出的代码没有正确重现案例,有人可以帮助我理解吗?

c# asynchronous task-parallel-library

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

如何使用vba在userform中声明自定义事件

我有userform收集一些用户输入.现在我要做的是,当单击"确定"按钮时,声明从userform抛出一些事件.我是vba的新手,所以我不知道怎么做.任何代码或指向教程的链接将不胜感激.

Load UserForm1
UserForm1.Show
//here I want to capture UserForm1 OK button's click event and read the data
Run Code Online (Sandbox Code Playgroud)

vba ms-word word-vba

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

将分配哪一代静态只读成员

有这个代码

class Program
    {
        private static readonly int[] s_numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

        static void Main(string[] args)
        {
            foreach (int number in s_numbers)
            {
                WriteLine(number);
            }

            WriteLine("Press ENTER to close the app.");
            ReadLine();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想知道哪个s_numbers数组将被分配(哪一代)?我的理由如下 - 因为这是static readonly成员,它不会是nulled,所以它不会GC'd是终生的AppDomain.因此,将它直接放入GEN2是有意义的(就像使用大型物体一样)并且不在GEN0中分配它然后将它从GEN0移动到GEN2.不幸的是,我无法确认是否是这种情况(我无法使用WinDbg找到此数组).

那么重申一个问题 - 该static readonly成员将分配哪一代GC ?

.net c#

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