小编Sco*_*ott的帖子

Task.Start/Wait和Async/Await有什么区别?

我可能会遗漏一些东西但是做什么之间有什么不同:

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)

c# conceptual task-parallel-library async-await .net-4.5

204
推荐指数
5
解决办法
8万
查看次数

为什么接口不起作用,而抽象类却使用泛型类约束?

下面的代码显示了一个带有类型约束(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>'"

问题:(使用更新的订阅方法)

一旦我将`IMsg`更改为抽象类而不是接口,为什么错误会消失?

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)

c# generics abstract-class interface constraints

12
推荐指数
1
解决办法
584
查看次数

DataTemplate中的样式是否仅应用于ItemsControl中的最后一项?

在下面的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)

解:

不幸的是,当Content被设置为TextBlock而不是直接文本的控件时,我仍然无法解释为什么'Content'Setter无法处理除最后一个DataObject之外的所有DataObject.

但是,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)

wpf xaml styles datatemplate itemscontrol

11
推荐指数
2
解决办法
1万
查看次数