小编maf*_*afu的帖子

C#的高可用性和可扩展性

我有一个C#服务,目前在PC上运行单实例.我想拆分这个组件,以便它可以在多台PC上运行.应为每台PC分配一部分工作.如果一台PC出现故障,则应将其工作移至备用机器.

数据同步可以由DB完成,因此这不应该是一个问题.我目前的想法是使用某种负载均衡器来分割并将传入的请求发送到PC阵列,并确保实际处理工作.

我该如何实现这样的功能?我不确定我是否在问正确的问题.如果我对如何实现这一目标的理解是错误的,请给我一个提示.

编辑:

  1. 我想知道上面给出的想法(负载均衡器拆分工作包到PC并检查结果)是否可行.如果有某种已经实现的解决方案,所以这个看似常见的问题,我很乐意使用该解决方案.

  2. 可用性是一项关键要求.

c# scalability load-balancing

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

这段代码是线程安全的吗?

我有一个有几个属性的课程.在每次更新值时,Store都会调用一个方法来存储所有字段(在文件中).

private int _Prop1;
public int Prop1 {
    get {
        return _Prop1;
    }
    set {
        _Prop1 = value;
        Store();
    }
}

// more similar properties here...

private XmlSerializer _Ser = new ...;
private void Store()
{
    lock (_Ser) {
        using (FileStream fs = new ...) {
            _Ser.Serialize (fs, this);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个设计是线程安全的吗?

(顺便说一下,如果你能想到一个更合适的标题,可以随意编辑.)

我认为它是线程安全的.如果在多个线程上更改了属性,则值将按随机顺序设置,原子存储将以随机顺序发生,但最终,每个属性都将具有其最新值,并且最后会发生原子存储,确保文件是最新的.

澄清:属性不会经常设置,但可以同时设置.重要的是大部分时间都有一个有效的文件.

如果线程要根据属性值更改属性,则必须锁定整个对象以与其他线程同步.这与锁定on List枚举基本相同,并不是此类的责任.

c# locking thread-safety

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

如何使用LINQ选择具有最高值的项目?

想象一下,你有一个这样的课:

class Foo {
    string key;
    int value;
}
Run Code Online (Sandbox Code Playgroud)

你如何选择具有最高价值的Foo IEnumeralbe<Foo>

一个基本问题是保持迭代次数较低(即1),但这会影响可读性.毕竟,我能找到的最好的东西是这样的:

IEnumerable<Foo> list;
Foo max = list.Aggregate ((l, r) => l.value > r.value ? l : r);
Run Code Online (Sandbox Code Playgroud)

你能想到一个更好的方法吗?

编辑:list.OrderByDescending(l => l.value).First();是我的首选,但它不是O(n).

c# linq

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

如何防止使用赋值表达式的返回值可能带来的安全隐患?

在C#中,赋值表达式将LHS操作数的值作为值返回:

int i;
while ((i = foo()) > 5) { ... }
Run Code Online (Sandbox Code Playgroud)

这通常很方便,也适用于C风格的语言.但是,它也可能导致很难发现错误,例如:

if ((options == (__WCLONE|__WALL)) && (current.hasUid = true)) retval = -EINVAL;
// Also consider the case of a nullable bool
Run Code Online (Sandbox Code Playgroud)

特别是在安全关键代码中,我想在编译使用此语言功能的代码时至少生成警告.

我该怎么办呢?我是否必须为代码检查工具创建自定义规则?

编辑修复:早些时候,错误的例子是错误地使用int赋值而不是bool赋值.

更新:我同意这x = true是多余的,并邀请上述错误.编写良好的代码不应表现出允许出现这种错误所必需的条件.

特别是我想通过检查(以自动方式)所涉及的问题来确保不会发生这些情况.这增加了在问题进入之前捕获问题的机会.

.net c# security

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

ConsoleColors 的实际 RGB 值是多少?

我正在将彩色控制台输出转换为 HTML。目前,我首先将 ConsoleColors 翻译为同名的颜色(手动翻译为深黄色,因为它不存在)。

然而,我发现一些同名的 Color 和 ConsoleColor 看起来很不同,例如 CC-Green 只是 #008000 而不是 #00FF00(我确认这实际的 RGB 值)。

我找不到所有 ConsoleColors 的实际 RGB 值的列表,我可以在映射表中使用它。这样的列表存在吗?

.net console colors

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

WCF:如何在正常关闭连接的同时发送数据?

我有一个提供Login方法的WCF服务.客户端需要调用此方法(因为它是唯一的IsInitiating = true).在任何情况下,此方法都应返回一个描述调用成功的字符串.如果登录失败,则应关闭连接.

问题在于收盘时间.我想发送返回值,然后立即关闭连接.

string Login (string name, string pass)
{
    if (name != pass) {
        OperationContext.Current.Channel.Close ();
        return "fail";
    }
    else {
        return "yay";
    }
}
Run Code Online (Sandbox Code Playgroud)

MSDN指出,呼吁Close在通道上

导致ICommunicationObject从Opened状态正常转换为Closed状态.Close方法允许在返回之前完成任何未完成的工作.例如,完成发送任何缓冲的消息).

这对我来说不起作用(或者我的理解是错误的),因为close立即执行--WCF不等待Login方法完成执行并返回字符串但是先关闭连接.

因此,我假设调用Close不会等待运行方法完成.现在,我怎么还能返回一个值,然后关闭?

在我的绝望中,我尝试了以下,但这不是一个严肃的解决方案.

new Thread (() => {
    Thread.Sleep (100);
    OperationContext.Current.Channel.Close ();
}).Start ();
Run Code Online (Sandbox Code Playgroud)

wcf

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

Math.Pi常量是错误的

我很清楚Double只有很多精度,但是如果可能的话我们仍然应该尽量达到高精度.所以我当然不希望在官方的.NET 4系统库中看到这一点.

// Summary:
//     Represents the ratio of the circumference of a circle to its diameter,
//     specified by the constant, ?.
public const double PI = 3.14159;
Run Code Online (Sandbox Code Playgroud)

为什么只有6位数?使用准确的值会很容易且自由.我不是在.NET中做科学工作,但我确信其他人都做了,而且当Pi不准确时,他们会感到惊讶.同样适用于E.

编辑:这调整为关于Visual Studio中常量的反映.见 后续问题

.net math

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

如果目录为空,我该如何正确删除目录?

当且仅当它不包含文件时,我想删除目录.

我正在检查目录中的0个文件系统条目,然后立即删除,但这留下了我想避免的边缘情况.锁定目录似乎就是这样.大多数文件系统可能不提供此功能,但可能有一些解决方法?

.net windows filesystems directory

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

挂钩到BinaryWriter的Dispose

我想通过为他们提供一个BinaryWriter来使写作更舒适,并且可以自动将其数据添加到某个内部队列中.

为此,我想编写BinaryWriter的子类并覆盖其Dispose方法.但是,Dispose不是虚拟的.挂钩是否足够Dispose(bool)?还是有更好的方法?

.net c# overriding dispose binarywriter

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

给定数字集的排列

有人可以解释一个好的算法,以有效的方式找到给定数字集的所有排列吗?

.net c# permutation

-2
推荐指数
2
解决办法
2206
查看次数

立即取消引用unique_ptr

我对现代C++不太熟悉,希望更好地理解以下片段:

State & m_rootstate;
//...
auto currstate = std::make_unique<State> (m_rootstate);
do_something (*currstate);
// currstate is not used anywhere else
Run Code Online (Sandbox Code Playgroud)

我看到a unique_ptr是从对a​​的引用创建的State.这应该使用copy ctor State来创建一个新实例State,并指向这个新实例的指针currstate.

currstate然后立即取消引用作为函数的参数.currstate之后没有使用,但是在调用完成之后它不会超出范围,所以它和它的链接State不会过早被破坏.

对于调用,使用其中的值unique_ptr.取决于是否do_something采取StateState&,它将被再次复制.

这是正确的吗?如果是这样,是否正确的目的unique_ptr只是创建一个副本m_rootstate而不必担心内存管理?

c++ unique-ptr

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