小编And*_*dir的帖子

Silverlight中的反射限制

哪里描述了众所周知的Silverlight类型的反射限制?

例如:如果我尝试使用PropertyInfo.SetValue方法设置protected或private属性值,我会得到一个异常MethodAccessException.

为什么这些限制?

reflection silverlight

8
推荐指数
1
解决办法
3265
查看次数

为什么finally块中的代码不执行?

似乎finally块不执行,如果它不是主线程执行代码.在这种情况下是否有可能强制执行?

环境:VS 2010,.Net Framework 4.0.3

class Program
{
    static void Main(string[] args)
    {
        var h = new AutoResetEvent(false);

        ThreadPool.QueueUserWorkItem(
            obj => TestProc(h));

        h.WaitOne();
    }

    private static void TestProc(EventWaitHandle h)
    {
        try
        {
            Trace.WriteLine("Try");
            h.Set();
        }
        catch(Exception)
        {
            Trace.WriteLine("Catch");
        }
        finally
        {
            Thread.Sleep(2000);
            Trace.WriteLine("Finally");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

我在MSDN中找到了关于该案例的提及和解释:

ThreadAbortException类 http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx

当调用Abort方法来销毁线程时,公共语言运行库会抛出ThreadAbortException.ThreadAbortException是一个可以捕获的特殊异常,但它会在catch块的末尾自动再次引发.引发此异常,运行时会在结束线程之前执行所有finally块.因为线程可以在finally块中执行无限制计算或调用Thread.ResetAbort来取消中止,所以无法保证线程将永远结束.如果要等到中止的线程结束,可以调用Thread.Join方法.Join是一个阻塞调用,在线程实际停止执行之前不会返回.

注意:

当公共语言运行库(CLR)在托管可执行文件中的所有前台线程结束后停止后台线程时,它不使用Thread.Abort.因此,您无法使用ThreadAbortException来检测CLR何时终止后台线程.


前景和背景线程 http://msdn.microsoft.com/en-us/library/h339syd0.aspx

当运行时停止后台线程因为进程正在关闭时,线程中不会抛出异常.但是,当因为AppDomain.Unload方法卸载应用程序域而停止线程时,前台和后台线程中都会抛出ThreadAbortException.


那么为什么在应用程序结束时CLR不会使用AppDomain.Unload方法在主进程结束(kill)之前卸载应用程序域?因为http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx:

当线程调用Unload时,目标域将标记为卸载.专用线程尝试卸载域,并且域中的所有线程都将中止.如果线程没有中止,例如因为它正在执行非托管代码,或者因为它正在执行finally块,那么在一段时间之后,在最初调用Unload的线程中抛出CannotUnloadAppDomainException.如果最终无法中止的线程结束,则不会卸载目标域.因此,在.NET Framework 2.0版域中不保证卸载,因为它可能无法终止执行线程.

结论:在某些情况下,我需要考虑我的代码是否会在后台或前台线程中执行?在应用程序主线程结束所有工作之前,我的代码是否可能无法完成?

.net c# multithreading try-catch-finally

8
推荐指数
1
解决办法
3063
查看次数

MSBuild与目标输出和返回混淆行为

我试图理解输出和返回参数背后的逻辑.在使用Outputs&Returns属性的情况下,我发现了非常令人困惑的行为.

我创建了一个包含2个目标"Build"和"InternalTarget"的项目.第一个目标通过Outputs属性定义其输出,第二个目标通过Returns属性定义输出.所以,如果我通过MSBuild任务调用Build target,我就无法获得任何输出 - 它总是空的!但是如果我注释掉第二个目标(无论如何都是未使用的),输出会神奇地出现.

为什么会这样?

example.proj

<Project ToolsVersion="4.0"
         DefaultTargets="Build"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">    
    <Target Name="Build" 
            Outputs="Build executed">
        <Message Text="Build executing ..." />
    </Target>

    <Target Name="_InternalTarget"
            Returns="_InternalTarget executed">
        <Message Text="_InternalTarget executing ..." />
    </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)

build.proj

<Project ToolsVersion="4.0"
         DefaultTargets="Build"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <_ProjectsToBuild Include="example.proj" />
    </ItemGroup>

    <PropertyGroup>
        <_ProjectsToBuildProperties>
            Configuration=Debug;
        </_ProjectsToBuildProperties>
    </PropertyGroup>

    <Target Name="Build">
        <MSBuild Targets="Build"
                 Projects="@(_ProjectsToBuild)"
                 Properties="$(_ProjectsToBuildProperties)">
            <Output TaskParameter="TargetOutputs"
                    ItemName="_ProjectsToBuildOutput" />
        </MSBuild>

        <Message Text="Output: @(_ProjectsToBuildOutput)." />
    </Target>    
</Project>
Run Code Online (Sandbox Code Playgroud)

产量

Build started 3/4/2015 12:41:21 PM.
Project "C:\Development\Sources\MSBuildReturnsExample\build.proj" on node 1 (default targets).
Project "C:\Development\Sources\MSBuildReturnsExample\build.proj" (1) …
Run Code Online (Sandbox Code Playgroud)

.net msbuild automation build build-system

7
推荐指数
1
解决办法
2459
查看次数