回答編集履歴

2

追記

2019/03/21 09:25

投稿

hihijiji
hihijiji

スコア4150

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

1

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

2019/03/21 09:25

投稿

hihijiji
hihijiji

スコア4150

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