Tag: 线程安全

原始数据类型是c#atomic(线程安全)吗?

例如,multithreading时是否需要锁定bool值?

线程安全的StreamWriter C#怎么做? 2

所以这是我上一个问题的延续 – 所以问题是“构建一个线程安全的程序的最佳方法是什么,它需要将双值写入文件。如果通过streamwriter保存值的函数是multithreading调用的?最好的方法是什么?“ 我修改了在MSDN上找到的一些代码,以下怎么样? 这个正确地将所有内容写入文件。 namespace SafeThread { class Program { static void Main() { Threading threader = new Threading(); AutoResetEvent autoEvent = new AutoResetEvent(false); Thread regularThread = new Thread(new ThreadStart(threader.ThreadMethod)); regularThread.Start(); ThreadPool.QueueUserWorkItem(new WaitCallback(threader.WorkMethod), autoEvent); // Wait for foreground thread to end. regularThread.Join(); // Wait for background thread to end. autoEvent.WaitOne(); } } class Threading […]

线程安全的memoization

让我们以Wes Dyer的函数memoization方法为出发点: public static Func Memoize(this Func f) { var map = new Dictionary(); return a => { R value; if (map.TryGetValue(a, out value)) return value; value = f(a); map.Add(a, value); return value; }; } 问题是,当从多个线程使用它时,我们可能遇到麻烦: Func f = … var f1 = f.Memoize(); … in thread 1: var y1 = f1(1); in thread 2: […]

使字典访问线程安全吗?

什么是使C#字典访问线程安全的最简单方法? 最好只使用锁(对象),但欢迎任何其他想法!

System.InvalidOperationException:集合已被修改

我在通过队列枚举时遇到以下exception: System.InvalidOperationException:集合已被修改; 枚举操作可能无法执行 这是代码摘录: 1: private bool extractWriteActions(out List channelWrites) 2: { 3: channelWrites = new List(); 4: foreach (TpotAction action in tpotActionQueue) 5: { 6: if (action is WriteChannel) 7: { 8: channelWrites.Add((WriteChannel)action); 9: lock(tpotActionQueue) 10: { 11: action.Status = RecordStatus.Batched; 12: } 13: } 14: } 15: return (channelWrites.Count > 0); 16: } […]

C#结构是否安全?

C#struct是否是线程安全的? 例如,如果有: struct Data { int _number; public int Number { get { return _number; } set { _number = value; } } public Data(int number) { _number = number; } } 在另一种类型: class DadData { public Data TheData { get; set; } } 是名为TheData的属性,线程安全吗?

可以从多个线程等待相同的任务 – 等待线程安全吗?

等待线程安全吗? 似乎Task类是线程安全的,所以我猜等待它也是线程安全的,但我还没有在任何地方找到确认。 线程安全也是定制awaiter的要求 – 我的意思是IsCompleted,GetAwaiter等方法? 即如果这些方法不是线程安全的,那么等待是否是线程安全的? 但是,我不希望很快就需要定制的等待者。 用户场景的一个示例:假设我有一个后台任务,它以异步方式返回结果,然后从多个线程使用: using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace scratch1 { class Foo { Task _task; public Foo() { _task = Task.Run(async () => { await Task.Delay(5000); return 5; }); } // Called from multiple threads public async Task Bar(int i) { return (await _task) + i; […]

如何以线程安全的方式访问c#WPF控件?

我尝试过使用MSDN中的示例,但它们似乎只适用于Windows窗体。 例如,使用.InvokeRequired的方法依赖于窗体控件,但是此方法不适用于WPF控件。 Backgound工作器方法也会抛出InvalidOperationException – 调用线程无法访问此对象,因为另一个线程拥有它。 那么如何在WPF环境中完成呢?

System.Lazy 具有不同的线程安全模式

.NET 4.0的System.Lazy 类通过枚举LazyThreadSafetyMode提供三种线程安全模式,我将其概括为: LazyThreadSafetyMode.None – 不是线程安全的。 LazyThreadSafetyMode.ExecutionAndPublication – 只有一个并发线程将尝试创建基础值。 成功创建后,所有等待的线程将获得相同的值。 如果在创建期间发生未处理的exception,则将在每个等待的线程上重新抛出它,在每次后续尝试访问基础值时进行缓存和重新抛出。 LazyThreadSafetyMode.PublicationOnly – 多个并发线程将尝试创建基础值,但第一个成功将确定传递给所有线程的值。 如果在创建期间发生未处理的exception,则不会对其进行高速缓存,并且后续尝试访问基础值将重新尝试创建并可能成功。 我想要一个延迟初始化的值,它遵循稍微不同的线程安全规则,即: 只有一个并发线程将尝试创建基础值。 成功创建后,所有等待的线程将获得相同的值。 如果在创建过程中发生未处理的exception,它将在每个等待的线程上重新抛出,但它不会被缓存,后续尝试访问基础值将重新尝试创建并可能成功。 因此,与LazyThreadSafetyMode.ExecutionAndPublication的关键不同之处在于,如果创建时“先行”失败,可以在以后重新尝试。 是否存在提供这些语义的现有(.NET 4.0)类,还是我必须自己编写? 如果我自己滚动是否有一种聪明的方法可以在实现中重用现有的Lazy 以避免显式锁定/同步? NB对于一个用例,假设“创建”可能很昂贵并且容易出现间歇性错误,例如从远程服务器获取大量数据。 我不想进行多次并发尝试来获取数据,因为它们可能全部失败或全部成功。 但是,如果它们失败了,我希望以后能够重试。