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 に答える