草庐IT

多线程、Handler机制、ThreadLocal

全部标签

c# - 服务器和客户端应用程序之间的推送通知机制

我正在使用C#开发桌面应用程序,它通过WCFWeb服务与服务器通信。它应该是一种同步应用程序。这意味着当我在客户端应用程序上进行一些更改时,我也应该立即更新服务器(这很容易使用服务调用),但也应该提供这种机制,反之亦然,服务器上的更改必须立即应用于多个客户端。我知道我可以对我的服务器进行轮询,但这对我来说并不整洁,而且我也听说过双工服务,但我不确定我是否可以使用它来实现这种机制。我想就这个问题征求一些建议。提前致谢。 最佳答案 您需要实现发布和订阅设计。在WCF中,您可以使用net-tcp协议(protocol)连接双工客户端和服务

c# - 如何使 .NET COM 对象成为单元线程?

.NET对象默认是自由线程的。如果通过COM编码到另一个线程,它们总是被编码到自己,无论创建者线程是否为STA,也无论它们的ThreadingModel注册表值如何。我怀疑,他们汇总了FreeThreadedMarshaler(有关COM线程的更多详细信息,请参见here)。我想让我的.NETCOM对象在编码到另一个线程时使用标准的COM编码器代理。问题:usingSystem;usingSystem.Runtime.InteropServices;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows

c# - 仅在构造函数中使用私有(private) setter 是否会使对象线程安全?

我知道我可以像这样创建一个不可变的(即线程安全的)对象:classCantChangeThis{privatereadonlyintvalue;publicCantChangeThis(intvalue){this.value=value;}publicintValue{get{returnthis.value;}}}但是,我通常会“作弊”并这样做:classCantChangeThis{publicCantChangeThis(intvalue){this.Value=value;}publicintValue{get;privateset;}}然后我想知道,“为什么这行得通?”它真

c# - 使用 Interlocked 的线程安全 DateTime 更新。*

我可以使用Interlocked.*同步方法来更新DateTime变量吗?我希望在内存中保留最后一次触摸时间戳。多个http线程将更新最后一次触摸DateTime变量。我很欣赏DateTime变量是被替换而不是更新的值类型。我能想到的最好的方法是将时间戳记作为一个long中的总滴答数classx{long_lastHit;voidTouch(){Interlocked.Exchange(ref_lastHit,DateTime.Now.Ticks);}} 最佳答案 选项1:使用带有Interlocked和DateTime.ToBin

c# - 当另一个线程/进程不必要地使用独占锁时,是否可以绕过 C# 中的文件锁?

有没有办法在不终止线程的情况下绕过或删除另一个线程持有的文件锁?我正在我的应用程序中使用第三方库,该库对文件执行只读操作。我需要第二个线程同时读取文件以提取第三方库未公开的一些额外数据。不幸的是,第三方库使用读/写锁打开了文件,因此我得到了通常的“该进程无法访问该文件......因为它正在被另一个进程使用”的异常。我想避免用我的线程预加载整个文件,因为文件很大,会导致加载此文件时不必要的延迟和过多的内存使用。由于文件的大小,复制文件不切实际。在正常操作期间,两个线程访问同一个文件不会导致任何严重的IO争用/性能问题。我不需要两个线程之间完美的时间同步,但它们需要在彼此的半秒内读取相同的

c# - C# List<T> 的线程安全给读者

我计划在静态构造函数中创建一次列表,然后让该类的多个实例同时读取它(并枚举它)而不进行任何锁定。在本文中http://msdn.microsoft.com/en-us/library/6sh2ey19.aspxMS是这样描述线程安全问题的:Publicstatic(SharedinVisualBasic)membersofthistypearethreadsafe.Anyinstancemembersarenotguaranteedtobethreadsafe.AListcansupportmultiplereadersconcurrently,aslongasthecollectio

c# - 如何用多个线程写入单个文件?

我正在用C#创建Windows应用程序,我想在其中写入具有多个线程的多个文件。我从不同的端口获取数据,每个端口都有一个文件。是否有可能为每个端口创建线程并一次又一次地使用相同的线程将数据写入相应的文件?假设我从端口10000、10001、10002获取数据,并且有三个文件10000.txt、10001.txt和10002.txt。我必须创建三个线程分别将数据写入这三个文件,我想一次又一次地使用这些线程。可能吗?如果可能的话,您能提供一小部分代码示例吗? 最佳答案 如评论中所述,这是自找麻烦。所以,你需要有一个线程安全的编写器类:pu

c# - 使用 async/await 限制信号量线程

我最近遇到了一个针对异步/等待调用限制线程的示例。在我的机器上分析和运行代码后,我想出了一种稍微不同的方法来做同样的事情。我不确定的是引擎盖下发生的事情是否几乎相同,或者是否有任何值得注意的细微差别?这是基于原始示例的代码:privatereadonlySemaphoreSlim_semaphore=newSemaphoreSlim(5);publicasyncTaskCallThrottledTasks(){vartasks=newList();for(intcount=1;count{try{intresult=awaitLongRunningTask();Debug.Print(

c# - 只读 HashSet 本身是线程安全的吗?

如果我初始化一个HashSet在Lazy里面初始化程序,然后从不更改内容,是HashSet本质上是线程安全的?是否有需要锁定的读取操作?类似的Java问题here对于一般的集合,这基本上是肯定的,但有一些警告(不适用于这种情况)。 最佳答案 是的,是的。只要施工了HashSet对象是线程安全的,只要内容不变,访问它就始终是线程安全的。如果你initializeLazy使用LazyThreadSafetyMode.PublicationOnly你可以确定Lazy的初始化是线程安全的。Whenmultiplethreadstrytoin

c# - 在 HashSet<T> 中是否包含线程安全

查看Contains的代码在HashSet.NET源代码中的类,我找不到任何原因Contains不是线程安全的吗?我正在加载HashSet提前使用值,然后检查Contains在多线程中。AsParallel()循环。这有什么不安全的原因吗?我不愿意使用ConcurrentDictionary当我实际上不需要存储值时。 最佳答案 通常(通常)仅用于读取的集合是“非官方”线程安全的(我知道.NET中没有任何集合在读取期间会自行修改).有一些注意事项:项目本身可能不是线程安全的(但对于HashSet,这个问题应该被最小化,因为你不能从中提