1

事件处理程序返回后,变量 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);
    });
}
4

1 回答 1

1

.NET 使用闭包来防止垃圾收集器删除uiContext内部方法、操作等仍需要它的时候(此处Task.Factory.StartNew)。

看:

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

于 2013-08-09T11:53:53.913 回答