内部方法变量范围

时间:2013-08-09 11:47:54

标签: c# .net

变量uiContext会在事件处理程序返回后超出范围吗?编译器在场景后面做了什么来使这段代码工作。

private void findButton_Click(object sender, RoutedEventArgs e)
{
    SynchronizationContext uiContext = SynchronizationContext.Current;

    Task.Factory.StartNew(() =>
    {
        string pictures =
            Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
        var folder = new DirectoryInfo(pictures);
        FileInfo[] allFiles =
            folder.GetFiles("*.jpg", SearchOption.AllDirectories);
        FileInfo largest =
            allFiles.OrderByDescending(f => f.Length).FirstOrDefault();

        uiContext.Post(unusedArg =>
        {
            outputTextBox.Text = string.Format("Largest file ({0}MB) is {1}",
                largest.Length / (1024 * 1024), largest.FullName);
        },
        null);
    });
}

1 个答案:

答案 0 :(得分:1)

.NET使用闭包来防止垃圾收集器删除uiContext,而内部方法,操作等仍然需要它(这里Task.Factory.StartNew)。

请参阅:

此外,SynchronizationContext是一个类,当您使用Current属性或者它返回现有属性时,您不知道新实例是否为createad。因此,您可能不是唯一具有该实例引用的人。