我试图了解在任务对象中引发但从未处理的异常发生了什么.
在MSDn上,据说:
如果您不等待传播异常的任务或访问其Exception属性,则在对任务进行垃圾回收时,将根据.NET异常策略升级异常.
所以我不太明白这些异常会以何种方式影响程序流程.我认为这些异常应该在垃圾收集后立即中断执行.但我无法设计这种行为.在以下代码段中,抛出的异常不会显示.
// Do something ...
Task.Run (()=> {throw new Exception("Exception in the task!");});
// Do something else
Run Code Online (Sandbox Code Playgroud)
请问,任何人都可以解释如何处理未处理的任务异常,以及它们如何影响程序流程.
我有一个带有gridview的listview控件,因为它是view属性.其中一个专栏用于显示非常长的文本.该列单元格模板设置为TextBlock.每当listview项目源只包含一个项目时,无论提到哪个TextBlock内容开始超过listview高度,垂直滚动都不可用.
<ListView ItemsSource="{Binding Path=ReportEntries}" VerticalContentAlignment="Top" ScrollViewer.VerticalScrollBarVisibility="Visible">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="VerticalContentAlignment" Value="Top"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Path}" />
<GridViewColumn Header="Message" Width="50" DisplayMemberBinding="{Binding Message}" />
<GridViewColumn Header="Details" DisplayMemberBinding="{Binding Details}" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock TextWrapping="Wrap" Text="{Binding}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
Run Code Online (Sandbox Code Playgroud)
我必须实现通用扩展deepclone方法,该方法可以与任何引用类型实例一起使用以获取其深层副本。我实现如下
static class ClassCopy
{
static public T DeepClone<T> (this T instance)
{
if (instance == null) return null;
var type = instance.GetType();
T copy;
var flags = BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance;
var fields = type.GetFields(flags);
// If type is serializable - create instance copy using BinaryFormatter
if (type.IsSerializable)
{
using (var stream = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(stream, instance);
stream.Position = 0;
copy = (T) formatter.Deserialize(stream);
}
// Copy all fiels which …
Run Code Online (Sandbox Code Playgroud) 我有一个关于多态方法的问题.我有两个类:带有非虚方法的基类,Foo( )
它调用它的虚方法Foo (int i)
(如下所示:Foo() {Foo(1);})
以及覆盖方法的派生类)Foo(int i)
.
如果我调用Foo()
派生类的实例的方法,则演练如下:base Foo() -> override Foo(int i)
.但是如果我将覆盖方法更改为新的,则演练如下:base Foo -> base Foo(int i)
.它甚至没有达到新Foo(int i)
方法.请解释这些方法的顺序以及它的原因.
using System;
class Program
{
sealed void Main()
{
DerivedClass d = new DerivedClass();
//Goes to BaseClass Foo() method
//then goes to Derived Foo(int i ) method
d.Foo();
}
}
class BaseClass
{
public void Foo() { Foo(1); }
public virtual void Foo(int i) { // …
Run Code Online (Sandbox Code Playgroud)