teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2019/03/21 09:25

投稿

hihijiji
hihijiji

スコア4152

answer CHANGED
@@ -1,3 +1,49 @@
1
- ``GC.Collect()`` はガベージコレクタの実行を強要するだけで、同期的にガベージコレクタの完了を待ったりはしません。
1
+ ~~``GC.Collect()`` はガベージコレクタの実行を強要するだけで、同期的にガベージコレクタの完了を待ったりはしません。
2
2
  (Disposeパターンが実装されていて)Disposeを呼ばれたあとはファイナライザが走らないので、回収されたかも確実に知る方法は多分ないと思います。
3
- 適度にウェイトを入れてから確認するぐらいでしょう。
3
+ 適度にウェイトを入れてから確認するぐらいでしょう。~~
4
+
5
+ --- 追記 ---
6
+ Zuishinさんのコードを借りて確認したところ、Close()すれば回収はされるようです。
7
+ Windowはファイナライザが走らないと仮説を立てましたが、検証コードは能力不足で書けませんでした。
8
+ ```C#
9
+ private async void Application_Startup(object sender, StartupEventArgs e)
10
+ {
11
+ var references = new[]
12
+ {
13
+ (typeof(MainWindow).Name, new WeakReference(new MainWindow())),
14
+ (typeof(Window).Name, new WeakReference(new Window())),
15
+ (typeof(ContentControl).Name, new WeakReference(new ContentControl())),
16
+ (typeof(Control).Name, new WeakReference(new Control())),
17
+ (typeof(object).Name, new WeakReference(new object()))
18
+ };
19
+
20
+ new Window(); // Application の終了を防ぐためのインスタンス
21
+
22
+ await Task.Run(async () =>
23
+ {
24
+ while (true)
25
+ {
26
+ Debug.WriteLine("-------------");
27
+ foreach (var (Name, Reference) in references)
28
+ {
29
+ if (Reference.IsAlive)
30
+ {
31
+ Debug.WriteLine($"{Name} is alive.");
32
+ if (Reference.Target is Window window)
33
+ {
34
+ window?.Dispatcher?.Invoke(() => window?.Show());
35
+ await Task.Delay(2000);
36
+ window?.Dispatcher?.Invoke(() => window?.Close());
37
+ }
38
+ }
39
+ else
40
+ {
41
+ Debug.WriteLine($"{Name} is dead.");
42
+ }
43
+ }
44
+ await Task.Delay(1000);
45
+ GC.Collect();
46
+ }
47
+ });
48
+ }
49
+ ```

1

すこし解りやすく書き換えてみた

2019/03/21 09:25

投稿

hihijiji
hihijiji

スコア4152

answer CHANGED
@@ -1,3 +1,3 @@
1
- ``GC.Collect()`` はガベージコレクタの実行を強要するだけで、同期的に了を待ったりはしません。
1
+ ``GC.Collect()`` はガベージコレクタの実行を強要するだけで、同期的にガベージコレクタの完了を待ったりはしません。
2
- Disposeパターンが実装されていとファイナライザが走らないので、回収されたかも確実に知る方法は多分ないと思います。
2
+ (Disposeパターンが実装されていて)Disposeを呼ばれたあファイナライザが走らないので、回収されたかも確実に知る方法は多分ないと思います。
3
3
  適度にウェイトを入れてから確認するぐらいでしょう。