变量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);
});
}
答案 0 :(得分:1)
.NET使用闭包来防止垃圾收集器删除uiContext
,而内部方法,操作等仍然需要它(这里Task.Factory.StartNew
)。
请参阅:
此外,SynchronizationContext
是一个类,当您使用Current
属性或者它返回现有属性时,您不知道新实例是否为createad。因此,您可能不是唯一具有该实例引用的人。