Tag:

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

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

像Node.js / V8一样的.NET线程?

我已经离开了.NET桌面编程一段时间了,同时喝了Node.js koolaid。 Node.js的某些部分我觉得很容易使用。 特别是,我喜欢线程模型的简单性,并且我可以获得multithreading应用程序的一些好处,同时只编写代码来跟踪单个线程。 现在,我需要在.NET中编写一个multithreading应用程序,我想到我没有理由不使用用于构建Node.js应用程序的类似线程模型 。 特别是,我想: 使用回调参数调用长时间运行的函数。 (该函数将在池中的线​​程上执行。也许在新线程上调用函数的简单包装函数就足够了吗?) 让那些回调函数调用在“主”线程上运行以进行处理 保持此“主”线程访问的所有对象的自动同步,因此锁定不是问题 这个线程模型的这种框架是否已存在于.NET应用程序中? 如果没有,是否有部分.NET已经支持或处理我正在寻求的一些function?

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

我有多个线程将项添加到无锁队列。 然后由另一个线程处理这些项目。 在生产者线程中,我需要启动消费者线程, 但前提是它尚未运行或启动 。 特别: 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。 🙁

C#中的空合并运算符(??)是否是线程安全的?

以下代码中是否存在可能导致NullReferenceException的竞争条件? – 要么 – 在空合并运算符检查空值之后但在调用函数之前,是否可以将Callback变量设置为null? class MyClass { public Action Callback { get; set; } public void DoCallback() { (Callback ?? new Action(() => { }))(); } } 编辑 这是一个出于好奇而产生的问题。 我通常不会这样编码。 我并不担心Callback变量会变得陈旧。 我担心从DoCallback抛出exception。 编辑#2 这是我的class级: class MyClass { Action Callback { get; set; } public void DoCallbackCoalesce() { (Callback ?? new Action(() => { }))(); […]

.NET框架中的线程生命周期

此链接中解释了.NET框架中的线程状态。 我最近在一个网站上看到了这张照片,我想到了几个问题: OS中的线程生命周期与.NET框架中的线程生命周期并不完全一致。 有人可以提供与.NET框架中的操作系统状态相匹配的资源吗? 我们在.NET框架中没有名为Blocked的状态。 如果发出I / O请求,线程的状态是什么? Aborted州的目的是什么? 当一个线程调用Abort()方法时,它将进入AbortRequested状态,并在线程响应中止请求后,它将进入Stopped状态。 那么Aborted状态的function是什么?

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()); […]