我正在编写一个C#Windows窗体应用程序,该应用程序通过算法(策略)处理来自市场的报价,以向经纪公司创建订单.在我尝试构建与每个策略同时运行多个策略的能力之前,所有这些似乎都进行了相当好的测试.此时一切都开始运行不正确.我相信我有一些不是线程安全的类,它们会导致不稳定的行为.任何关于我如何以线程安全的方式来解决这个问题的见解深表赞赏!
将报价输入算法的方式如下:1)市场数据事件从Brokers Software发布到我的软件中称为ConnectionStatus的客户端类.当市场数据事件被触发时,Quote对象是根据这些静态变量的当前值构建的,这些变量代表Bid,ask等.一旦构建了报价,我就会努力将其发送到正在运行的每个策略算法中.这是我用来做的代码:
foreach (StrategyAssembler assembler in StrategyAssembleList.GetStrategies())
{
BackgroundWorker thread = strategyThreadPool.GetFreeThread();
if (thread != null)
{
thread.DoWork += new DoWorkEventHandler(assembler.NewIncomingQuote);
thread.RunWorkerAsync(quote);
}
}
Run Code Online (Sandbox Code Playgroud)
StrategyAssembler是一个创建Class StrategyManager实例的类,后者又创建包含实际算法的策略实例.可能有4或6个不同的StrategyAssembler实例,每个实例都已添加到StrategyAssembleList的Singleton实例中,该实例是BindingList.
传入的引用对象被传递到StrategyAssembler类的NewIncomingQuote方法.该代码如下:
public void NewIncomingQuote(object sender, DoWorkEventArgs e)
{
Quote QUOTE = e.Argument as Quote;
lock (QuoteLocker)
{
manager.LiveQuote(QUOTE);
priorQuote = QUOTE;
}
}
Run Code Online (Sandbox Code Playgroud)
我想通过在将引用传递给manager.LiveQuote(引用引用)方法之前使用锁定,所有使用此点"下游"引用的对象都能够以线程安全的方式使用引用,但是测试显示不然.有没有办法可以将StrategyAssembler的每个实例放在自己的线程上,以确保Strategy Assembler创建的所有对象都是线程安全的,然后将引用提供给StrategyAssembler?这种思维方式是否适合应对这种情况?
在此先感谢您的任何反馈或帮助,
Learning1
我们有一堆数据,我们希望向asp-net.mvc网站上的世界公开.我想确保我们使用易于最终开发人员实施且不依赖于任何特定平台的技术来提供它,而不是使用不受欢迎/与开发人员不兼容的技术.
我们期望的那种请求主要是检索搜索结果(不是很多参数),但是我们希望能够提供目录查找等,这可能更复杂.
牢记这一点,这样做的首选方法是什么?
似乎有许多不同的方法在JavaScript中执行OO.
我喜欢:
function ClassA(){};
ClassA.prototype={
someFunc:function(a,b,c){},
otherFunc:function(){}
}
var c=new ClassA();
Run Code Online (Sandbox Code Playgroud)
并且从未使用过超出此功能的功能(尽管是一个熟练的OOer).我怀疑这是老式的,因为我经常看到新的闪烁变体,这让我想知道我是否选择了最好的方法.例如,你可以在构造函数方法中创建魔法来创建私有变量和访问器方法,我认为(直到最近)是不可能的.子类化怎么样?我不知道如何实现这一点,但它现在必须具有某种共同模式.
你是怎么做到的,为什么?
编写完可以归结为以下内容的代码后:
var size=-1;
var arr=new byte[size];
Run Code Online (Sandbox Code Playgroud)
我很惊讶它抛出了一个OverflowException.OverflowException状态的文档:
我无法看到为这个异常提供的描述如何提供负大小和数组长度,所以深入研究并发现这确实是指定的行为:
尺寸长度的计算值验证如下.如果一个或多个值小于零,则抛出System.OverflowException,并且不执行进一步的步骤.
我想知道为什么选择了OverflowException.如果你问我,那会很误导.我花了至少5分钟的调查时间(不计算我的思考).任何人都可以对这个(我认为)特殊的设计决定有所了解吗?
如果我设置HttpWebRequest.CachePolicy如下:
var webRequest = (HttpWebRequest) WebRequest.Create(url);
var policy = new HttpRequestCachePolicy( HttpCacheAgeControl.MaxAge,
TimeSpan.FromMinutes(1) );
webRequest.CachePolicy = policy;
Run Code Online (Sandbox Code Playgroud)
并在同一时刻对同一个URL发出两个异步请求,第二个请求会发生什么?第二个是否仅在第一个缓存时完成,或者是否会发出2个请求,因为在发布时没有任何缓存在缓存中?
此外,在这种情况下,什么是缓存?它在哪里生活?我们是否能更好地控制它?
冲洗Stream后是否需要冲洗StreamWriter?
public static async Task WriteStringAsync(this Stream stream, string messageString)
{
var encoding = new UTF8Encoding(false); //no BOM
using (var streamWriter = new StreamWriter(stream, encoding))
{
await streamWriter.WriteAsync(messageString);
await streamWriter.FlushAsync();
}
await stream.FlushAsync(); //is this necessary?
}
Run Code Online (Sandbox Code Playgroud) 在写这个答案时,我被问到是否有关于ActionFilterAttribute行为的保证.我无法自信地回答.
特别是,方法四个OnActionExecuted,OnActionExecuting,OnResultExecuted和OnResultExecuting保证被要求穿过属性,还是有情节的所有请求(例如异常,断开的连接等),其中一个或多个阶段可能不火呢?
我在制作一些稍微不那么微不足道的东西时撞毁了LinqPad.我不想重新启动它,直到我确定不会危及恢复我的工作(如果可能的话).我的问题是:LinqPad是否写了临时文件,可能仍然包含我编写的代码?
对于后人来说,这是一个每次都崩溃LinqPad的测试案例(也发布到LinqPad论坛):
void Main()
{
Crasher.Crash();
}
class Crasher
{
public static void Crash()
{
var a=0;
Crash();
a++; //let's get something in the tail so compiler
//doesn't optimise tail recursion and prevent
//stackoverflow
}
}
Run Code Online (Sandbox Code Playgroud) c# ×5
asp.net-mvc ×2
javascript ×2
.net ×1
arrays ×1
caching ×1
crash ×1
flush ×1
jquery ×1
linqpad ×1
named-pipes ×1
oop ×1
stream ×1
streamwriter ×1
threadpool ×1
wcf ×1
web-services ×1