相关疑难解决方法(0)

.NET中是否可以使用非阻塞,单线程,异步Web服务器(如Node.js)?

我正在研究这个问题,寻找一种在.NET中创建基于事件的单线程非阻塞异步Web服务器的方法.

这个答案首先看起来很有希望,声称代码的主体在一个线程中运行.

但是,我在C#中对此进行了测试:

using System;
using System.IO;
using System.Threading;

class Program
{
    static void Main()
    {
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

        var sc = new SynchronizationContext();
        SynchronizationContext.SetSynchronizationContext(sc);
        {
            var path = Environment.ExpandEnvironmentVariables(
                @"%SystemRoot%\Notepad.exe");
            var fs = new FileStream(path, FileMode.Open,
                FileAccess.Read, FileShare.ReadWrite, 1024 * 4, true);
            var bytes = new byte[1024];
            fs.BeginRead(bytes, 0, bytes.Length, ar =>
            {
                sc.Post(dummy =>
                {
                    var res = fs.EndRead(ar);

                    // Are we in the same thread?
                    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
                }, null);
            }, null);
        }
        Thread.Sleep(100);
    }
} …
Run Code Online (Sandbox Code Playgroud)

c# events multithreading asynchronous node.js

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

我们应该使用"工作站"垃圾收集还是"服务器"垃圾收集?

我有一个在多核4路服务器上运行的大型多线程C#应用程序.目前我们正在使用"服务器模式"垃圾收集.但是,测试表明工作站模式GC更快.

MSDN说:

使用服务器API的托管代码应用程序通过使用服务器优化的垃圾收集器(GC)而不是默认的工作站GC获得了显着的好处.

Workstation是默认的GC模式,也是单处理器计算机上唯一可用的模式.Workstation GC托管在控制台和Windows窗体应用程序中.它与正在运行的程序同时执行完整(第2代)集合,从而最大限度地减少延迟.此模式对于客户端应用程序非常有用,其中感知性能通常比原始吞吐量更重要.

服务器GC仅在多处理器计算机上可用.它为每个处理器创建一个单独的托管堆和线程,并且并行执行集合.在收集期间,所有托管线程都会暂停(运行本机代码的线程仅在本机调用返回时暂停).通过这种方式,服务器GC模式可以最大化吞吐量(每秒请求数),并随着处理器数量的增加而提高性能.性能尤其适用于具有四个或更多处理器的计算机.

但我们没有看到性能闪耀!!!! 有没有人有任何建议?

.net c# garbage-collection

30
推荐指数
2
解决办法
2万
查看次数