Tag: thread safety

为什么BindingList或ObservableCollection这样的类不是线程安全的?

一次又一次我发现自己必须编写BindingList和ObservableCollection的线程安全版本,因为当绑定到UI时,这些控件不能从多个线程更改。 我想要了解的是为什么会出现这种情况 – 这是设计错误还是故意这种行为?

FileShare.None是否让线程等到文件流关闭?

使用文件流时,将FileShare设置为None ,并说两个用户同时访问同一个函数想要读/写该文件。 FileShare.None会让第二个用户请求等待还是第二个用户的请求会抛出exception? //two users get to this this code at the same time using (FileStream filestream = new FileStream(chosenFile, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) using (StreamReader sr = new StreamReader(filestream)) using (StreamWriter sw = new StreamWriter(filestream)) { //reading and writing to file } Msdn说:无拒绝共享当前文件。 在文件关闭之前,任何打开文件的请求(通过此进程或其他进程)都将失败。 但请求会继续尝试,直到文件流关闭?

C#中的线程安全和System.Text.Encoding

从不同的线程使用相同的Encoding对象是否安全? 通过“使用”我的意思是,调用Encoding.GetString() , Encoding.GetBytes()并用XmlWriter编写一些XML(由XmlWriter.Create(myStream, new XmlWriterSettings() { Encoding = myEncoding }) 。 msdn网站声明“不保证所有实例成员都是线程安全的”。 那么,如何安全地同时编写两个XML文档呢? (谢谢!!)

.NET ref参数是线程安全的,还是容易受到不安全的multithreading访问?

编辑介绍: 我们知道C#中的ref参数传递对变量的引用 ,允许在被调用的方法中更改外部变量本身。 但是引用的处理方式与C指针非常相似(通过对该参数的每次访问读取原始变量的当前内容,并在对参数进行每次修改时更改原始变量),或者被调用的方法是否依赖于对该参数的一致引用通话时间? 前者提出了一些线程安全问题。 特别是: 我在C#中编写了一个静态方法,它通过引用传递一个对象: public static void Register(ref Definition newDefinition) { … } 调用者提供一个已完成但尚未注册的Definition对象,经过一些一致性检查后,我们“注册”他们提供的定义。 但是,如果已经有一个具有相同密钥的定义,则它无法注册新密钥,而是将其引用更新为该密钥的“官方” Definition 。 我们希望这是严格的线程安全,但我想到了一个病态场景。 假设客户端(使用我们的库)以非线程安全的方式共享引用,例如使用静态成员而不是局部变量: private static Definition riskyReference = null; 如果一个线程设置riskyReference = new Definition(“key 1”); ,填写定义,并调用我们的Definition.Register(ref riskyReference); 而另一个线程也决定设置riskyReference = new Definition(“key 2”); ,我们保证在我们的Register方法中,我们正在处理的newDefinition引用不会被其他线程修改(因为对象的引用被复制并在我们返回时将被复制出来吗?),或者可以线程在执行过程中替换我们上面的对象(如果我们引用指向原始存储位置的指针???),从而打破我们的理智检查? 请注意,这与对底层对象本身的更改不同,这对于引用类型(类)当然是可能的,但可以通过该类中的适当锁定来轻松防范。 但是,我们不能保护对外部客户端变量空间本身的更改! 我们必须在方法的顶部创建我们自己的参数副本并覆盖底部的参数(例如),但这对于编译器来说似乎更有意义,因为处理的是精神错乱不安全的参考。 因此,我倾向于认为引用可以被编译器复制并复制出来,以便该方法处理对原始对象的一致引用(直到它在需要时更改自己的引用),而不管是什么发生在其他线程上的原始位置。 但是我们在文档和参考参数的讨论中找不到关于这一点的确定答案。 有人可以通过明确的引用来缓解我的担忧吗? 编辑结论: 在用multithreading代码示例(感谢Marc!)确认它并进一步思考之后,它确实是我自己所担心的非自动线程安全行为。 “ref”的一点是通过引用传递大结构而不是复制它们。 另一个原因是你可能想要设置一个变量的长期监控,并且需要传递对它的引用,这将看到变量的变化(例如,在null和活动对象之间进行更改),这是一个自动复制 – in / copy-out不允许。 […]

如何使用AppDomain限制静态类的范围以便线程安全使用?

我被一个架构不佳的解决方案所困扰。 它不是线程安全的! 我在解决方案中有几个共享类和成员,在开发过程中一切都很酷…… BizTalk已经沉没了我的战舰。 我们使用自定义BizTalk适配器来调用我的程序集。 适配器正在调用我的代码并并行运行,所以我假设它在同一个AppDomain下使用多个线程。 我想做的是让我的代码在自己的AppDomain下运行,这样我所遇到的共同问题就不会相互混淆。 我有一个非常简单的类,BizTalk适配器实例化然后运行Process()方法。 我想在我的Process()方法中创建一个新的AppDomain,所以每次BizTalk都旋转另一个线程时,它将拥有自己的静态类和方法版本。 BizTalkAdapter代码: // this is inside the BizTalkAdapter and it is calling the Loader class // private void SendMessage(IBaseMessage message, TransactionalTransmitProperties properties) { Stream strm = message.BodyPart.GetOriginalDataStream(); string connectionString = properties.ConnectionString; string msgFileName = message.Context.Read(“ReceivedFileName”, “http://schemas.microsoft.com/BizTalk/2003/file-properties”) as string; Loader loader = new Loader(strm, msgFileName, connectionString); loader.Process(); EventLog.WriteEntry(“Loader”, […]

C# – 参数在静态方法中是否安全?

这个方法是线程安全的吗? 好像它不是…… public static void Foo(string _str, Guid _id) { _str = _str + _id.ToString(); /* Do Stuff */ return }

.NET 2.0:File.AppendAllText(…) – 线程安全实现

作为闲置好奇心的练习,请考虑以下简单的日志记录类: internal static class Logging { private static object threadlock; static Logging() { threadlock = new object(); } internal static void WriteLog(string message) { try { lock (threadlock) { File.AppendAllText(@”C:\logfile.log”, message); } } catch { …handle logging errors… } } } lock需要围绕File.AppendAllText(…)还是通过自己的实现本身就是线程安全的方法? 搜索有关这方面的信息会产生许多相互矛盾的信息,有些人说是,有些人说不。 MSDN什么也没说。

C#线程中的只读字段是否安全?

C#线程中的只读字段是否安全? public class Foo { private readonly int _someField; public Foo() { _someField = 0; } public Foo(int someField) { _someField = someField; } public void SomeMethod() { doSomething(_someField); } } 经历了一些post: – 在C#中将字段标记为只读有什么好处? – JaredPar认为,曾经构建的只读字段是不可变的,因此是安全的。 – Readonly Fields和Thread Safety ,表明如果构造函数做了很多工作,那么存在一些风险。 因此,如果在上面的代码中使用readonly字段,并且构造函数很轻,那么它是否是线程安全的? 如果someField是ref类型(例如字符串数组)怎么办?

ReaderWriterLockSlim.EnterUpgradeableReadLock()始终是死锁?

我对ReaderWriterLockSlim非常熟悉,但我最近尝试在类中实现了EnterUpgradeableReadLock() …很快我意识到当2个或更multithreading运行代码时,这几乎肯定是一个保证死锁: Thread A –> enter upgradeable read lock Thread B –> enter upgradeable read lock Thread A –> tries to enter write lock, blocks for B to leave read Thread B –> tries to enter write lock, blocks for A to leave read Thread A –> waiting for B to exit read lock Thread […]

Lucene.Net写/读同步

我可以将(使用IndexWriter )新文档写入索引,同时打开它来读取(使用IndexReader )吗? 或者我必须在写作前仔细阅读? 我是否可以在打开IndexWriter使用IndexWriter在索引中读取/搜索文档(使用IndexReader )? 或者我必须在阅读前结束写作吗? Lucene.Net线程安全与否? 或者我必须自己写吗?