Tag: 线程安全

异步写入套接字线程是否安全?

考虑Socket.BeginSend()方法。 如果两个线程池线程同时调用此方法,它们各自的消息是否最终会相互混合,或者套接字类是否阻止这种情况发生?

c#锁定传递给方法的引用 – 不好的做法?

我有一个类似的方法: public static void DoSomething (string param1, string param2, SomeObject o) { //….. lock(o) { o.Things.Add(param1); o.Update(); // etc…. } } 几点: 用这种方式锁定不好的做法? 我应该锁定private static object吗? 如果是这样,为什么?

在处置后监控多个Threading.Timers

我有一个进程,它创建一个动态的定时器列表(System.Threading.Timer)并继续运行,直到收到一个信号终止。 一旦收到信号终止,我希望任何现有的定时器回调完成(见下文): private IList _timers = new List(); … … private void WaitOnExecutingThreads() { var waiters = new List(_timers.Count); foreach (var timer in _timers) { var onWait = new ManualResetEvent(false); waiters.Add(onWait); timer.Dispose(onWait); } WaitHandle.WaitAll(waiters.ToArray()); waiters.ForEach(x=> x.Dispose()); } 此代码现在可以正常工作,但是我希望在处理定时器后监视正在进行的线程回调。 我的意图是以给定间隔写入日志“定时器A仍在运行”。 我开始玩: ThreadPool.RegisterWaitForSingleObject(….) add添加了以下内容:(注意:我创建了一个包含计时器和关联数据的ThreadContext类) private void WaitOnExecutingThreads() { var waiters = new List(); WaitOrTimerCallback IsRunning = (x, […]

我是否需要使用ReaderWriterLockSlim的MemoryBarrier?

看起来单声道实现在ReaderWriterLockSlim方法中没有MemoryBarrier调用。 因此,当我在write lock内进行任何更改时,我可以在另一个使用read lock线程中接收旧的缓存值。 真的有可能吗? 我应该在读写锁定内的代码之前和之后插入MemoryBarrier吗?

蓝色屏幕导致C#程序?

这只是蓝屏显示的重要内容。 我在Windows 7 x64上。 “已检测到问题,Windows已关闭,以防止损坏您的计算机。 PROCESS_HAS_LOCKED_PAGES * STOP:0x00000076(0x0000000000000000,0xfffffa8009dcd060,0x0000000000000011,0x0000000000000000)“ 我现在无法工作,因为每次关闭它都会得到一个蓝屏! 除了运行下面的后台工作程序之外,该程序还没有做任何事情。 它ping所有可能属于用户家庭网络的地址,并尝试连接到另一个程序将侦听的某个端口。 private void NetworkScanner_DoWork(object sender, DoWorkEventArgs e) { bool ExceptionEncountered = false; int IPsProcessed = 0; NetworkSearcherOutput = “Starting network scanner…”; NetworkSearcher.ReportProgress(0); Thread.Sleep(1000); foreach (IPAddress IP in Dns.GetHostAddresses(Dns.GetHostName())) { if (IP.AddressFamily == AddressFamily.InterNetwork) { string[] Octets = IP.ToString().Split(‘.’); Octets[3] = “0”; IPAddress CurrentAddressIteration = StringArrayToIP(Octets); […]

c#Thread Safe Deep Copy

我一直在阅读很多其他问题以及很多谷歌搜索,我一直无法找到一个明确的解决方案。 基于我读过的一些最佳实践,类的静态方法应该是线程安全的,实例成员应该为消费者提供线程安全性。 我想为这个类实现一个深层复制方法。 该类本身具有其他引用类型成员。 有没有办法使深度复制方法线程安全,而不必将开销强加给类的所有实例成员?

WCF的DataContractSerilaizer线程安全吗?

我一直在将一个相当大的系统从Remoting转换为WCF,并且一切似乎运行良好,除了我们经常遇到以下exception:“System.InvalidOperationException:Collection被修改;枚举操作可能无法执行。” 我没有任何运气跟踪它,因为它只发生在有数百个调用通过时,我只能假设它是因为一个对象被修改,因为它被序列化。 所有类都使用: [DataContract(IsReference=true)] 。 使用远程处理时没有类似的例外,所以我想知道是否有人在WCF中遇到过类似的问题或者可以让我知道它可能是序列化程序 – 在这种情况下我假设我必须编写自己的序列化程序来执行在必要时locks (这是我宁愿避免的一项重大任务)。 以下是堆栈跟踪: WCF Error: at System.Collections.Generic.List1.Enumerator.MoveNextRare() at WriteArrayOfLineToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , CollectionDataContract ) at System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerializeReference(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle […]

BinaryFormatter是否对线程安全进行序列化和反序列化?

引用这个问题的答案。 可以改写为: private static BinaryFormatter formatter = new BinaryFormatter(); public static T DeepClone(this T a) { using(MemoryStream stream = new MemoryStream()) { formatter.Serialize(stream, a); stream.Position = 0; return (T)formatter.Deserialize(stream); } } 那么为每次调用避免构造(和GC)一个新的BinaryFormatter? 这个代码路径非常频繁,因为它涉及我们的缓存层,我想尽可能轻量级。 谢谢。

尝试获取comboBox的值时,“跨线程操作无效”exception

“Cross-thread operation is not valid” exception 我经历了很多次此exception,但所有那些时候我都在设置控件的值。 那时我解决了使用一个名为SetControlPropertyThreadSafe()的函数,该函数仅由stackoverflow.com上的某人建议。 但是这次我在尝试获取comboBox的值时遇到此exception。 这是代码: string cat; private void button1_Click(object sender, EventArgs e) { if (textBox1.Text.Trim().Length > 20) { System.Threading.Thread t = new System.Threading.Thread(addQuickTopic); t.Start(); } else MessageBox.Show(“The length of the title must be greater than 20”, “Title length invalid”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } public string tTitle=””; void addQuickTopic() { Global.SetControlPropertyThreadSafe(button1, […]

ConcurrentDictionary替代可移植类库

我正在编写一个面向.NET 4.5,Windowsapp store应用程序和Windows Phone 8的可移植类库。我需要一个高效的内存缓存机制,因此我考虑使用ConcurrentDictionary ,但它不可用于WP8。 会有很多读取和相对较少的写入,所以理想情况下我想要一个支持来自多个线程的无锁读取的集合,并由单个线程写入。 根据MSDN ,非通用Hashtable具有该属性,但不幸的是它在PCL中不可用… PCL中是否有另一个符合此要求的集合类? 如果没有,那么在不锁定读取的情况下实现线程安全的好方法是什么? (锁定写入是可以的,因为它不会经常发生) 编辑:感谢JaredPar的指导,我最终使用来自Microsoft.Bcl.Immutable的 ImmutableDictionary以完全无锁的方式实现了我的缓存: class Cache { private IImmutableDictionary _cache = ImmutableDictionary.Create(); public TValue GetOrAdd(TKey key, [NotNull] Func valueFactory) { valueFactory.CheckArgumentNull(“valueFactory”); TValue newValue = default(TValue); bool newValueCreated = false; while (true) { var oldCache = _cache; TValue value; if (oldCache.TryGetValue(key, out value)) return value; // […]