Tag: 线程线程安全

实例构造函数设置一个静态成员,它是否是线程安全的?

我正在重新考虑一些代码,并且想知道在实例构造函数中使用lock 。 public class MyClass { private static Int32 counter = 0; private Int32 myCount; public MyClass() { lock(this) { counter++; myCount = counter; } } } 请确认 实例构造函数是线程安全的。 lock语句阻止访问该代码块,而不是静态“计数器”成员。 如果原始程序员的意图是让每个实例知道它的’count’,我将如何同步访问’counter’成员以确保另一个线程不是新的MyClass并在此之前更改计数它的数量? 仅供参考 – 此课程不是单身人士。 实例必须只知道它们的编号。

我如何确保只有一个线程可以执行某些操作?

我有多个线程将项添加到无锁队列。 然后由另一个线程处理这些项目。 在生产者线程中,我需要启动消费者线程, 但前提是它尚未运行或启动 。 特别: public void BeginInvoke(Action method) { //This runs on multiple background threads pendingActions.Enqueue(method); if (ProcessQueue hasn’t been posted) uiContext.Post(ProcessQueue, null); } private void ProcessQueue(object unused) { //This runs on the UI thread. Action current; while (pendingActions.TryDequeue(out current)) current(); } 我使用的是.Net 3.5,而不是4.0。 🙁

HttpContext类及其线程安全性

我在应用程序中有一个具有以下属性的Singleton对象: private AllocationActionsCollection AllocationActions { get { return HttpContext.Current.Session[“AllocationOptions.AllocationActions”] as AllocationActionsCollection; } set { HttpContext.Current.Session[“AllocationOptions.AllocationActions”] = value; } } 我正在处理一个错误( HttpContext.Current.Session [“AllocationOptions.AllocationActions”]为null,即使它应该总是设置为有效的实例…)。 我刚刚在MSDN中读到HttpContext实例成员不保证是线程安全的! 我想知道这是不是问题。 应用程序中某处可能存在资源竞争,而HttpContext.Current.Session [“AllocationOptions.AllocationActions”]为空的时刻是使用此语句使用AllocationActions setter的时刻: AllocationActions = new AllocationActionsCollection(Instance.CacheId); 我的问题是: a)我很震惊HttpContext.Current.Session不是线程安全的。 那么如何安全地使用那个属性呢? b)你有什么想法为什么Session变量可以为null(即使我很确定我在第一次使用它之前设置它)? 谢谢你,帕维尔 编辑1: a)使用以下语句每隔2分钟设置初始化会话变量的行(在Page_Load中执行) AllocationActions = new AllocationActionsCollection(Instance.CacheId); b)调用getter的代码在事件处理程序中调用(如Button_Click) c)应用程序中没有自定义线程。 只有常见的HTTP Handler

同时访问2个线程上的对象

我有一个拥有2个线程的c#应用程序。 一个线程正在创建一个对象,而在第二个线程中使用相同的对象。 大部分时间它工作正常,但它给出了一些时间和错误Object is in use currently elsewhere. 如何让线程同时使用对象? 谢谢 编辑 我正在访问一个Bitmap对象。 一个线程是从流创建这个位图,在PictureBox上显示它,第二个线程再次将此Bitmap转换为Byte并在网络上传输它。

跨线程的HTTPContext

我需要为每个Web请求实例化一个单例对象,以便数据处理一次并在整个请求中有效,我使用HttpContext.Current.Items在HTTP请求期间共享数据,一切都很好,直到我们需要单例对象实例在多个线程中,我想到的第一件事就是将HttpContext实例传递给新线程: HttpContext context = HttpContext.Current; ThreadPool.QueueUserWorkItem(callback => { HttpContext.Current = context; // blah blah }); 我不认为这是一种线程安全的方法,如此处所述 。 使用Reflector我认为HttpContext.Current.Items实际上使用CallContext在每个逻辑线程中存储对象。 所以我将单例界面更改为: public static SingletonType SingletonInstance { get { return CallContext.GetData(key) as SingletonType; } set { CallContext.SetData(key, value); } } 并在启动任何新线程时简单地覆盖SingletonInstance ! 代码工作正常,但似乎在某种程度上负载很重,CallContext.GetData(key)返回null并且应用程序崩溃与空引用exception! 我在想,如果CallContext.GetData是primefaces的? 但它似乎不对,CallContext是特定于线程的数据存储,必须是primefaces的,否则我就错过了这一点! 我的另一个猜测是设置SingletonInstance(CallContext.SetData)发生在一个线程中,而CallContext.GetData在另一个线程中执行,如此处所述,但我不知道如何/为什么? 更新: 我们将每个在线用户的实例保存在服务器上的arrays中。 单例对象实际上是对表示当前用户的对象的引用。 当前用户必须是唯一的,并且在每个线程中都可用于数据库查询,日志记录,error handling等等,这是如何完成的: public static ApplicationUser CurrentUser { get { […]

c#中的方法锁定

我有一个类有这三种方法。 许multithreading都使用此类。 如果Method2和/或Method3在任何线程中运行,我希望Method1等待。 有什么建议? public class Class1 { public static void Method1() { Object lockThis = new Object(); lock (lockThis) { //Body function } } public static void Method2() { //Body function } public static void Method3() { //Body function } }

C#RabbitMQ客户端线程安全

ConnectionFactory factory = new ConnectionFactory {HostName = “localhost”}; using (IConnection connection = factory.CreateConnection()) using (IModel channel = connection.CreateModel()) { channel.QueueDeclare(“hello”, false, false, false, null); for (int i = 0; i < 100000; i++) { MemoryStream stream = new MemoryStream(); var user = new User { Id = i }; Serializer.Serialize(stream, user); channel.BasicPublish("", "hello", null, stream.ToArray()); […]

Application.LoadComponent的线程错误(密钥已存在)

MSDN说System.Windows.Application的公共静态成员是线程安全的。 但是当我尝试使用多个线程运行我的应用程序时,我得到以下exception: ArgumentException: An entry with the same key already exists. at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) at System.Collections.Generic.SortedList`2.Add(TKey key, TValue value) at System.IO.Packaging.Package.AddIfNoPrefixCollisionDetected(ValidatedPartUri partUri, PackagePart part) at System.IO.Packaging.Package.GetPartHelper(Uri partUri) at System.IO.Packaging.Package.GetPart(Uri partUri) at System.Windows.Application.GetResourceOrContentPart(Uri uri) at System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean bSkipJournaledProperties) at System.Windows.Application.LoadComponent(Uri resourceLocator) 以下调用发生exception: genericResources = (ResourceDictionary)Application.LoadComponent(new Uri(“/Themes/Generic.xaml”, UriKind.Relative)); 该应用程序在单个线程上工作正常,甚至在两个或三个上。 当我从5点起床后,每次都会收到错误。 难道我做错了什么? 我该怎么做才能解决这个问题?

String类中的线程安全性

使用String类从本地变量构建字符串是否安全,如下面的方法一样? 假设从多个线程调用以下方法。 public static string WriteResult(int value, string name) { return string.Format(“Result: value={0} name={1}”, value, name); } public static string WriteResult2(int value, string name) { return “Result: value=” + value + ” name=” + name; } 或者我是否需要使用StringBuilder来确保线程安全?

Interlocked是否保证C#中其他线程的可见性,还是仍然需要使用volatile?

我一直在阅读类似问题的答案,但我仍然有点困惑……亚伯有一个很好的答案,但这是我不确定的部分: …声明变量volatile会使每次访问都变得不稳定。 不可能以任何其他方式强制执行此行为,因此不能用Interlocked替换volatile。 在其他库,接口或硬件可以访问您的变量并随时更新它或需要最新版本的情况下,这是必需的。 Interlocked是否保证对所有线程的primefaces操作的可见性,或者我是否仍然必须在值上使用volatile关键字以保证对更改的可见性? 这是我的例子: volatile int value = 100000; // 0) { // do something } } public void AThreadMethod() { while(value > 0) { // do something } } 更新: 我是一个糟糕的运动,我改变了原来的例子,所以这里又是: public class CountDownLatch { private volatile int m_remain; // <— do I need the volatile keyword here? private EventWaitHandle m_event; public […]