我可能会遗漏一些东西但是做什么之间有什么不同:
public void MyMethod()
{
Task t = Task.Factory.StartNew(DoSomethingThatTakesTime);
t.Wait();
UpdateLabelToSayItsComplete();
}
public async void MyMethod()
{
var result = Task.Factory.StartNew(DoSomethingThatTakesTime);
await result;
UpdateLabelToSayItsComplete();
}
private void DoSomethingThatTakesTime()
{
Thread.Sleep(10000);
}
Run Code Online (Sandbox Code Playgroud) 下面的代码显示了一个带有类型约束(Pub<T>)的泛型类.该类有一个可以引发的事件,允许我们向订阅者传递消息.约束是消息必须实现IMsg(或者从IMsg它是抽象类时继承).
Pub<T>还提供了一种Subscribe方法,notify当且仅当对象实现时,才允许对象订阅该事件IHandler<IMsg>.
使用.NET 4,下面的代码显示错误,baseImplementer.NotifyEventHandler说明:
"No overload for 'IHandler<IMsg>.NotifyEventHandler(IMsg)' matches delegate 'System.Action<T>'"
public interface IMsg { } // Doesn't work
//public abstract class IMsg { } // Does work
public class Msg : IMsg { }
public class Pub<T> where T : IMsg
{
public event Action<T> notify;
public void Subscribe(object subscriber)
{
// Subscriber subscribes if it implements IHandler of the exact same …Run Code Online (Sandbox Code Playgroud) 在下面的XAML中,我有一个ItemsControl,它有三个DataObjects.
我使用DataTemplate将DataObjects显示为带有"X"的按钮.
Button使用样式设置其内容.
如果Setter.Value为"X",一切都很棒!
但是,如果我将Setter.Value更改为TextProperty为"X"的TextBlock,则X仅出现在最后一个Button(第三个DataObject)上,前两个Buttons为空.
这是一个错误,还是任何人都能解释为什么会这样?
注1)这是一个人为的例子来隔离遇到的问题.
注2)我已将两个Setter.Value选项放在代码中,这样您只需将其中一个注释掉即可重现成功和不成功的情况.
注3)看来,这个问题特定于'内容'属性的Setters.如果我使用Setter作为Background属性,它将正确应用于所有DataObjects.
<Grid>
<Grid.Resources>
<Style x:Key="myButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Content">
<!--<Setter.Value>X</Setter.Value>-->
<Setter.Value><TextBlock Text="X" /></Setter.Value>
</Setter>
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="Red" />
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<ItemsControl>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type DataObject}">
<Button Height="24" Width="24" Style="{StaticResource myButtonStyle}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.Items>
<DataObject />
<DataObject />
<DataObject />
</ItemsControl.Items>
</ItemsControl>
</Grid>
Run Code Online (Sandbox Code Playgroud)
但是,Dmitry建议使用"ContentTemplate"而不是"Content"是一种非常可接受的解决方法,仍然允许使用可重复使用的样式.
<Grid>
<Grid.Resources>
<DataTemplate x:Key="textBlockWithX">
<TextBlock Text="X" />
</DataTemplate>
<Style x:Key="myButtonStyle" TargetType="{x:Type Button}">
<Setter Property="ContentTemplate" Value="{StaticResource textBlockWithX}" />
</Style>
</Grid.Resources>
<ItemsControl> …Run Code Online (Sandbox Code Playgroud) c# ×2
.net-4.5 ×1
async-await ×1
conceptual ×1
constraints ×1
datatemplate ×1
generics ×1
interface ×1
itemscontrol ×1
styles ×1
wpf ×1
xaml ×1