小编Pie*_*kel的帖子

每个实例的AppDomain还是进程?

我想知道是否应该为每个实例使用一个进程,或者我是否应该使用AppDomains 在单个进程中运行多个实例.

我有一个服务器应用程序遵循设计类似telnet.用户始终通过TCP连接,服务器保持工作站上显示的客户端会话的完整状态.

该软件需要支持最多至少500个并发连接,可能更多.典型的安装需要连续运行3到7个应用程序实例,尽管除了一个实例之外只有几个连接(它们用于测试,参考环境等).在内部,出于开发目的,每个环境最多有40个环境,最多20个并发连接.我的目标主机环境将是64位Windows.

我知道IIS使用的模型只有一个进程和多个进程AppDomain,但我也看到每个实例都有一个进程的优点.

我应该使用哪个以及为什么?

编辑:
不同的实例涉及同一应用程序的不同版本,这些版本不能一起运行AppDomain.此外,不同的实例不必彼此通信,仅用于管理目的的主服务.

.net c# tcp appdomain

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

线程安全如何是不可变对象?

每个人都说不可变对象是线程安全的,但为什么会这样呢?

在多核CPU上运行以下方案:

  • Core 1在内存位置读取一个对象,0x100并将其缓存在Core 1的L1/L2缓存中;
  • GC在该内存位置收集此对象,因为它已符合条件0x100并可用于新对象;
  • Core 2分配一个位于地址的(不可变)对象0x100;
  • Core 1获取对此新对象的引用,并在内存位置读取它0x100.

在这种情况下,当Core 1请求位置0x100处的值时,它是否可能从其L1/L2缓存中读取过时数据?我的直觉说这里仍然需要一个内存门来确保Core 1读取正确的数据.

以上分析是否正确,是否需要记忆门,或者我错过了什么?

更新:

我在这里描述的情况是每次GC收集时会发生的更复杂的版本.GC收集时,会重新排序内存.这意味着对象所处的物理位置发生了变化,并且L1/L2必须无效.大致相同的情况适用于上面的例子.

由于有理由期望.NET确保在重新排序内存后,不同的内核看到正确的内存状态,上述情况也不会成为问题.

.net concurrency multithreading immutability

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

为什么不能推断出这些类型的论点?

可能重复:
C#3.0泛型类型推断 - 将委托作为函数参数传递

为什么不能Main推断出调用中以下代码示例的类型参数?

using System;

class Program
{
    static void Main(string[] args)
    {
        Method(Action);
    }

    static void Action(int arg)
    {
        // ...
    }

    static void Method<T>(Action<T> action)
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这给出以下错误消息:

错误CS0411:Program.Method<T>(System.Action<T>) 无法从用法推断出方法的类型参数.尝试显式指定类型参数.

.net c# generics type-inference

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

具有单个对象字段的结构如何比原始对象更快?

我有一个struct包含单个object字段的对象,可以更轻松地处理对象.我想测试性能(我预计会有一些降级),但是我得到了非常令人惊讶的结果.实际版本struct更快:

没有盒子:8.08秒

带框:7.76秒

这怎么可能?

下面是重现结果的完整测试代码.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication68
{
    partial class Program
    {
        private const int Iterations = 100000000;

        static void Main(string[] args)
        {
            // Force JIT compilation.

            TimeWithoutBox(new MyObject());
            TimeWithoutBox(7);
            TimeBox(new MyObject());
            TimeBox(7);

            // The tests.

            var withoutBox = new TimeSpan();
            var box = new TimeSpan();

            for (int i = 0; i < 10; i++)
            {
                withoutBox += …
Run Code Online (Sandbox Code Playgroud)

.net c# performance

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

Console.WriteLine正确处理空字符串

只是发现Console.WriteLine可以null正确处理字符串Console.WriteLine((string)null);

我可以假设大多数类库正确处理空引用吗?

.net c# console-application

6
推荐指数
2
解决办法
4378
查看次数

WPF调度员性能(100-200更新/秒)

在WPF窗口中,我有一个绘制实时数据的折线图(WPF的Quinn-Curtis实时图表).简而言之,对于每个新值,我调用SetCurrentValue(x,y)方法,然后使用UpdateDraw()方法更新图表.

数据通过另一个线程中的TCP连接进入.每个新值都会导致DataReceived事件,其处理程序应将值绘制到图表中,然后更新它.从逻辑上讲,我无法直接调用UpdateDraw(),因为我的图表位于UI线程中,该线程与数据进入的线程不同.

所以我调用Dispatcher.Invoke(new Action(UpdateDraw())) - 这很好,只要我更新max.30次/秒.更频繁地更新时,Dispatcher无法跟上并且图表更新的速度比数据的速度慢.我使用模拟数据的单线程情况对此进行了测试,没有Dispatcher就没有问题.

所以,我的结论是Dispatcher对于这种情况来说太慢了.我实际上需要更新100-200次/秒!

有没有办法在Dispatcher上放置涡轮增压器,还是有其他方法可以解决这个问题?欢迎任何建议.

c# wpf multithreading

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

如何在Protobuf中实现VARIANT

作为 protobuf 协议的一部分,我需要能够发送动态类型的数据,有点像VARIANT。粗略地说,我要求数据是整数、字符串、布尔值或“其他”,其中“其他”(例如DateTime)被序列化为字符串。我需要能够将它们用作单个字段并在协议中多个不同位置的列表中使用。

如何才能最好地实现这一点,同时保持消息大小最小和性能最佳?

我正在使用 protobuf-net 和 C#。

编辑:
我在下面发布了一个建议的答案,其中使用了我认为所需的最小内存。

EDIT2:在http://github.com/pvginkel/ProtoVariant创建了一个具有完整实现的
github.com 项目。

.net c# protocol-buffers protobuf-net

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

如何在SQL查询中编写?

我需要'在访问查询中使用字符.

但如果我写选择Fname from MEN where Fnale = 'j'o'我得到错误

如何写字符 '

提前致谢

c# ms-access

4
推荐指数
2
解决办法
585
查看次数

在 Roslyn 诊断分析器中检测隐式转换

我想创建一个 Roslyn 诊断分析器来查找隐式转换,特别是如下构造:

DateTimeOffset v = new DateTime();
Run Code Online (Sandbox Code Playgroud)

这意味着我要么必须检测隐式强制转换,要么找到对DateTimeOffset.op_Implicit(DateTime).

但问题是 Roslyn 诊断分析器工作于语法,而不是语义模型。因此,我能想到的唯一方法是找出所有可能具有隐式转换的语法结构,并对它们运行语义分析。然而,这非常棘手,因为即使我能够创建可以生成隐式转换的语法结构的详尽列表,对语言的更改也可以轻松引入新的语法结构。

我的问题是是否有上述方法的替代方法。具体来说,是否可以编写一个针对语义模型运行的 Roslyn 诊断分析器?或者我错过了什么并且有比我上面描述的更好的选择吗?

c# roslyn

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

C# - 检查文件名以某个单词结尾

嗨,我想知道如何验证C#中的文件名,以检查它是否以某个单词结尾(不只是包含但位于文件名的末尾)

例如,我想修改以后缀供应商结尾的某些文件,因此我想验证每个文件以测试它是否以供应商结束,因此LondonSupplier.txt,ManchesterSupplier.txt和BirminghamSupplier.txt都将被验证并返回true但曼彻斯特供应商. txt不会.

这有可能吗?我知道你可以验证一个文件名,以测试文件名中任何地方的某个单词,但是有可能做我所建议的吗?

c# file

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