小编pda*_*e01的帖子

在背景线程上初始化单例的常见模式

我目前有一个单例,初始化最多可能需要10秒.但是,我不希望我的用户对此初始化进行惩罚(等待),因此我宁愿在应用程序启动期间在后台线程上引导此组件.这就是我所拥有的:

辛格尔顿:

public class MySingleton
{
    private static MySingleton _instance;
    private static readonly object _locker = new object();

    private MySingleton() 
    {
        Init();
    }
    public static MySingleton Instance 
    { 
        if(_instance == null) _instance = new MySingleton();
        return _instance;
    }
    public void Init()
    {
        lock(_locker)
        {
            if(_instance != null) return;

            // long running code here...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序启动:

Task.Factory.StartNew(() => MySingleton.Instance.Init());
Run Code Online (Sandbox Code Playgroud)

这段代码可以正常工作,防止双初始化,在初始化之前防范用户需要它的边缘情况,并防止有人忘记调用Init().

然而,由于两个原因,它感觉有点笨重:a)我将在启动时两次进入Init方法.b)我想在单例内部进行线程化,但必须启动初始化.

是否有更清洁/更好/更好的方法来处理这个?

在此先感谢大家的帮助.

**编辑:正如评论中指出的那样,Init被误认为是私有的.它应该是公开的并且已得到纠正.

.net c# singleton multithreading design-patterns

6
推荐指数
2
解决办法
5948
查看次数

SQL Server - 查询最近的日期范围

如果我有这样的表结构:

ProductCode  Date
Foo          4/1/2012
Foo          4/2/2012
Foo          4/3/2012
Foo          4/6/2012
Foo          4/7/2012
Foo          4/8/2012
Foo          4/9/2012
Foo          4/10/2012
Foo          4/15/2012
Foo          4/16/2012
Foo          4/17/2012
Run Code Online (Sandbox Code Playgroud)

有没有办法查询给定的日期范围ProductCodeDate(假设范围必须是连续的)?换句话说,对于该表中,富存在于3个日期范围:4/1-4/3; 4/6-4/10; 并且4/15-4/17我正在寻找给定日期的日期范围.

请注意,Foo没有日期的4/4,4/5,4/11,4/12,4/134/14.

示例:
ProductCode=Foo, Date=4/2将返回,4/1-4/3因为条目是顺序的.
ProductCode=Foo, Date=4/4将返回任何
ProductCode=Foo, Date=4/7不会返回,4/6-4/10因为条目是顺序的.
ProductCode=Foo, Date=4/12将返回什么
等等.

t-sql sql-server

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

AutoMapper - 条件映射

我环顾四周,无法找到问题的答案.我要做的是条件映射目标对象(不是字段/属性,对象).换句话说,这样的事情:

public class Source
{
    public int Id {get; set;}
    public string Flag {get; set;}
}
public class Destination
{
    public int Id {get; set;}
}

var sources = new List<Source> 
                  { 
                      new Source{Flag = "V", Id = 1},
                      new Source{Flag = "B", Id = 2} 
                  };

var destinations = Mapper.Map<List<Source>, List<Destination>>(sources);

destinations.Count.ShouldEqual(1);
destinations[0].Id.ShouldEqual(2);
Run Code Online (Sandbox Code Playgroud)

有谁知道如何配置类型映射?我正在寻找类似的东西:

Mapper.CreateMap<Source, Destination>()
    .SkipIf(src => src.Flag != "B");
Run Code Online (Sandbox Code Playgroud)

我只是在配置选项中看不到任何似乎支持这一点的内容.任何帮助将非常感激!提前致谢.

.net c# .net-4.0 automapper

4
推荐指数
2
解决办法
4133
查看次数