相关疑难解决方法(0)

volatile DateTime

由于DateTime不能声明为volatile,这是对的吗?:

        private DateTime _time;
        public DateTime Time
        {
            get
            {
                Thread.MemoryBarrier();
                return _time;
            }
            set
            {
                _time = value;
                Thread.MemoryBarrier();
            }
        }
Run Code Online (Sandbox Code Playgroud)

该属性可以从不同的线程访问,所以我想确保它们始终获得最新版本,而不使用争用(锁定).

编辑:

  • 我有一组难以创建的项目,每个项目都有一个名为CreationTime的DateTime属性,指示何时创建此项目.它被初始化为DateTime.UtcNow.
  • 每次访问项目时,该属性都会更新为DateTime.UtcNow.
  • 有一个线程,在线程计时器中及时执行,检查是否(DateTime.UtcNow + 1小时)> item.CreationTime,如果为true则删除该项.

我想确保当"删除线程"进入集合时,所有项目都有最新的"最后访问"DateTime,因此我可以避免再次创建项目,因为缓存保持该值几毫秒:d

提前致谢.

.net c# multithreading synchronization volatile

10
推荐指数
1
解决办法
6007
查看次数

锁定一个对象

我经常看到这里显示的代码,即分配对象的位置,然后用作"锁定对象".

在我看来,你可以使用任何对象,包括事件本身作为锁对象.为什么要分配一个什么都不做的新对象?我的理解是在对象上调用lock()实际上不会改变对象本身,也不会实际锁定它被使用,它只是用作多个锁定语句锚定的占位符.

public class Shape : IDrawingObject, IShape
{
    // Create an event for each interface event
    event EventHandler PreDrawEvent;
    event EventHandler PostDrawEvent;

    object objectLock = new Object();

    // Explicit interface implementation required.
    // Associate IDrawingObject's event with
    // PreDrawEvent
    event EventHandler IDrawingObject.OnDraw
    {
        add
        {
            lock (objectLock)
            {
                PreDrawEvent += value;
            }
        }
        remove
        {
            lock (objectLock)
            {
                PreDrawEvent -= value;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,这真的是一件好事吗?

c# locking

5
推荐指数
1
解决办法
2605
查看次数

标签 统计

c# ×2

.net ×1

locking ×1

multithreading ×1

synchronization ×1

volatile ×1