Tag: 同步

什么是条件同步?

有人可以向我解释条件同步吗? 一个例子(最好是在C#中)也将非常受欢迎。

List 没有实现SyncRoot!

每个人都使用很多List。 我需要迭代这个列表,所以我使用已知的SyncRoot模式。 最近我在这篇文章中注意到应该避免使用SyncRoot以支持“嵌入式”线程安全(每个方法将锁定私有对象而不使用SyncRoot属性暴露它)。 我能理解,部分我同意这一点。 问题是List 类没有实现SyncRoot属性,即使实现了ICollection接口,它暴露了SyncRoot属性。 我说这会使代码失效 List list = new List() list.SyncRoot; 给我以下编译器错误: 错误CS0117:’System.Collections.Generic.List’不包含’SyncRoot’的定义 …如果这是真的,我怎么能在迭代它时同步List 类型的公共属性?

等到所有任务完成unit testing

我有这门课,我想进行unit testing: public class SomeClass { public void Foo() { Bar(); } private void Bar() { Task.Factory.StartNew(() => { // Do something that takes some time (eg an HTTP request) }); } } 这就是我的unit testing的样子: [TestMethod] public void TestFoo() { // Arrange var obj = new SomeClass(); // Act obj.Foo(); obj.Foo(); obj.Foo(); // Assert /* […]

Threadpool程序在更快的服务器上运行得慢得多

upd我现在认为我的问题的根源不是“线程化”,因为我在程序的任何一点都观察到减速。 我认为在使用2个处理器时我的程序执行速度较慢可能是因为两个处理器需要在彼此之间“通信”。 我需要做一些测试。 我将尝试禁用其中一个处理器,看看会发生什么。 ==================================== 我不确定这是否是C#问题,可能更多关于硬件,但我认为C#最合适。 我使用便宜的DL120服务器,我决定升级到更昂贵的2处理器DL360p服务器。 出乎意料的是,我的C#程序在新服务器上的运行速度大约慢了2倍,这应该要快几倍。 我处理了大约60台仪器的FAST数据。 我为每个乐器创建了单独的任务,如下所示: BlockingCollection updatesQuery; if (instrument2OrderUpdates.ContainsKey(instrument)) { updatesQuery = instrument2OrderUpdates[instrument]; } else { updatesQuery = new BlockingCollection(); instrument2OrderUpdates[instrument] = updatesQuery; ScheduleFastOrdersProcessing(updatesQuery); } orderUpdate.Checkpoint(“updatesQuery.Add”); updatesQuery.Add(orderUpdate); } private void ScheduleFastOrdersProcessing(BlockingCollection updatesQuery) { Task.Factory.StartNew(() => { Instrument instrument = null; OrderBook orderBook = null; int lastRptSeqNum = -1; while (!updatesQuery.IsCompleted) […]

同步HTTP处理程序和异步HTTP处理程序之间的性能差异

同步HTTP处理程序和异步HTTP处理程序之间是否存在性能差异? IHttpHandler vs IHttpAsyncHandler 为什么选择另一个? 有什么好处?

停止时同步Timers.Timer经过的方法

参考MSDN关于System.Timers.Timer的这句话: Timer.Elapsed事件是在ThreadPool线程上引发的,因此事件处理方法可能在一个线程上运行,同时调用Timer.Stop方法在另一个线程上运行。 这可能导致在调用Stop方法后引发Elapsed事件。 通过将SignalTime属性与调用Stop方法的时间进行比较,无法阻止此竞争条件,因为事件处理方法可能在调用Stop方法时已经执行,或者可能在Stop方法之间开始执行被调用以及保存停止时间的时刻。 如果在事件处理方法仍在执行时阻止调用Stop方法的线程继续运行至关重要,请使用更强大的同步机制,例如Monitor类或CompareExchange方法。 使用CompareExchange方法的代码可以在Timer.Stop方法的示例中找到。 任何人都可以举一个“ 强大的同步机制,如Monitor类 ”来解释这究竟意味着什么? 我认为这意味着以某种方式使用锁,但我不确定如何实现它。

使用lock语句在C#中进行递归/嵌套锁定

可能重复: C#中的重入锁定 我在这里看过StackOverflow和MSDN ,并且无法相信我在互联网上找不到这个问题。 假设我有一个私有成员的课程,我想在几个公共方法中访问。 这些公共方法将由​​不同的线程调用,因此需要同步。 public class MyClass { private Object SomeSharedData = new Object(); public void MethodA() { lock( SomeSharedData) { // do something MethodB(); } } public void MethodB() { lock( SomeSharedData) { // do something } } } 请注意,MethodA和MethodB可以由此类的用户调用,但MethodA也调用MethodB,这会导致嵌套锁定条件。 这保证是安全的吗? 换句话说,.NET是通过引用计数锁来处理这个,所以当我弹出这些方法时,锁会减少吗? 或者.NET在幕后执行一些魔术,它只是忽略了源自同一线程的对象上的所有后续锁定?

为什么我的Winforms应用程序中的SynchronizationContext.Current为null?

我刚写了这段代码: System.Threading.SynchronizationContext.Current.Post( state => DoUpdateInUIThread((Abc)state), abc); 但System.Threading.SynchronizationContext.Current为null

使用进程间同步对象同步2个进程 – Mutex或AutoResetEvent

请考虑以下情形:我正在运行我的应用程序,在执行期间,必须运行另一个进程,并且只有在第二个进程完成内部特定初始化之后,我的第一个进程才能继续。 例如: … // Process1 code does various initializations here Process.Start(“Process2.exe”); // Wait until Process2 finishes its initialization and only then continue (Process2 doesn’t exit) … 我看到几个选项: Mutex – 在考虑进程间通信时会自动想到Mutex,但是,我看不到让Process1等待他自己生成的互斥锁的方法。 我可以使Process2创建一个互斥锁并等待Process1直到创建Mutex(使用轮询和Mutex.OpenExisting函数) AutoResetEvent – 那些对于任务来说是完美的,但是,似乎在.NET下这些不能用于进程间通信。 CreateEvent – 我可以使用P / Invoke并使用Win32 CreateEvent函数。 从理论上讲,它可以为我提供我需要的一切。 但是,如果可能的话,我宁愿不使用本机函数。 使用外部文件 – 最简单的方法就是使用一些操作系统外部对象(文件,注册表等)。 然而,这似乎相当hacky。 我很高兴听到你对这个案子的意见。 谢谢!

将ThreadStatic变量与async / await一起使用

使用C#中的新async / await关键字,现在会对使用ThreadStatic数据的方式(以及何时)产生影响,因为回调委托在不同的线程上执行,同时启动了async操作。 例如,以下简单的控制台应用程序: [ThreadStatic] private static string Secret; static void Main(string[] args) { Start().Wait(); Console.ReadKey(); } private static async Task Start() { Secret = “moo moo”; Console.WriteLine(“Started on thread [{0}]”, Thread.CurrentThread.ManagedThreadId); Console.WriteLine(“Secret is [{0}]”, Secret); await Sleepy(); Console.WriteLine(“Finished on thread [{0}]”, Thread.CurrentThread.ManagedThreadId); Console.WriteLine(“Secret is [{0}]”, Secret); } private static async Task Sleepy() { Console.WriteLine(“Was […]