在我工作的公司应用程序中有很多这样的代码:
var something = new Lazy<ISomething>(() =>
(ISomething)SomethingFactory
.GetSomething<ISomething>(args));
ISomething sth = something.Value;
Run Code Online (Sandbox Code Playgroud)
从我Lazy对此的理解是完全没有意义的,但我是公司的新手,我不想无理由争辩.那么 - 这段代码有什么意义吗?
我总是看到像这样实施的单身人士:
public class Singleton
{
static Singleton instance;
static object obj = new object();
public static Singleton Instance
{
get
{
lock (obj)
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
protected Singleton() { }
}
Run Code Online (Sandbox Code Playgroud)
像这样实现它是否有问题:
public class Singleton
{
static readonly Singleton instance = new Singleton();
public static Singleton Instance
{
get { return instance; }
}
protected Singleton() { }
}
Run Code Online (Sandbox Code Playgroud)
?它在第一次实现的同一时刻被初始化,所以我想知道为什么这不是一个流行的解决方案?它应该也更快,因为不需要条件,锁定并且字段被标记为只读,这将使编译器进行一些优化
我们不要谈论单身(反)模式本身
我正在尝试使用以下自定义任务计划程序来限制并发Web请求:
我这样使用它:
const int CONCURRENCY_LEVEL = 2;
static void Main()
{
TaskFactory factory = new TaskFactory(new LimitedConcurrencyLevelTaskScheduler(CONCURRENCY_LEVEL));
Task.WaitAll(new[] { factory.StartNew(() => SomeAction("first")), factory.StartNew(() => SomeAction("second")) });
Console.WriteLine("All tasks ended");
Console.Read();
}
static void SomeAction(string task)
{
Console.WriteLine(task + " task started");
Console.WriteLine(AnotherTask(task).Result);
Console.WriteLine(task + " task ended");
}
static async Task<string> AnotherTask(string task)
{
return await Task.Run(() =>
{
Console.WriteLine(task + " inner task started");
// imitate web requests
Thread.Sleep(200);
Console.WriteLine(task + " inner task ended");
return "ok"; …Run Code Online (Sandbox Code Playgroud) 所以我试图在ItemsControl项目删除过程中制作一些动画,ObservableCollectio<Item>
我知道我无法在卸载事件中执行此操作,因为执行任何动画都为时已晚,所以我尝试使用DataTrigger
我的xaml文件看起来像这样:
<DataTemplate DataType="{x:Type MyApp:Item}">
<Border x:Name="ItemBorder">
<Label Content="{Binding Path=Name}" />
</Border>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Removing}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:1" From="1.0" To="0.0"
Storyboard.TargetProperty="(Border.Opacity)" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
而我的Item课很简单:
public class Item : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };
private bool removing;
public bool Removing {
get
{
return removing;
}
set
{
removing = value;
PropertyChanged(this, new PropertyChangedEventArgs("Removing"));
}
}
// same with `Name` …Run Code Online (Sandbox Code Playgroud)