我有一个C#服务,目前在PC上运行单实例.我想拆分这个组件,以便它可以在多台PC上运行.应为每台PC分配一部分工作.如果一台PC出现故障,则应将其工作移至备用机器.
数据同步可以由DB完成,因此这不应该是一个问题.我目前的想法是使用某种负载均衡器来分割并将传入的请求发送到PC阵列,并确保实际处理工作.
我该如何实现这样的功能?我不确定我是否在问正确的问题.如果我对如何实现这一目标的理解是错误的,请给我一个提示.
编辑:
我想知道上面给出的想法(负载均衡器拆分工作包到PC并检查结果)是否可行.如果有某种已经实现的解决方案,所以这个看似常见的问题,我很乐意使用该解决方案.
可用性是一项关键要求.
我有一个有几个属性的课程.在每次更新值时,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枚举基本相同,并不是此类的责任.
想象一下,你有一个这样的课:
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#中,赋值表达式将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是多余的,并邀请上述错误.编写良好的代码不应表现出允许出现这种错误所必需的条件.
特别是我想通过检查(以自动方式)所涉及的问题来确保不会发生这些情况.这增加了在问题进入之前捕获问题的机会.
我正在将彩色控制台输出转换为 HTML。目前,我首先将 ConsoleColors 翻译为同名的颜色(手动翻译为深黄色,因为它不存在)。
然而,我发现一些同名的 Color 和 ConsoleColor 看起来很不同,例如 CC-Green 只是 #008000 而不是 #00FF00(我确认这是实际的 RGB 值)。
我找不到所有 ConsoleColors 的实际 RGB 值的列表,我可以在映射表中使用它。这样的列表存在吗?
我有一个提供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) 我很清楚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中常量的反映.见 后续问题
当且仅当它不包含文件时,我想删除目录.
我正在检查目录中的0个文件系统条目,然后立即删除,但这留下了我想避免的边缘情况.锁定目录似乎就是这样.大多数文件系统可能不提供此功能,但可能有一些解决方法?
我想通过为他们提供一个BinaryWriter来使写作更舒适,并且可以自动将其数据添加到某个内部队列中.
为此,我想编写BinaryWriter的子类并覆盖其Dispose方法.但是,Dispose不是虚拟的.挂钩是否足够Dispose(bool)?还是有更好的方法?
我对现代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采取State或State&,它将被再次复制.
这是正确的吗?如果是这样,是否正确的目的unique_ptr只是创建一个副本m_rootstate而不必担心内存管理?
.net ×6
c# ×6
binarywriter ×1
c++ ×1
colors ×1
console ×1
directory ×1
dispose ×1
filesystems ×1
linq ×1
locking ×1
math ×1
overriding ×1
permutation ×1
scalability ×1
security ×1
unique-ptr ×1
wcf ×1
windows ×1