質問編集履歴

16

誤記修正。

2019/03/22 08:11

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -456,7 +456,7 @@
456
456
 
457
457
  1. Window クラスを new するとその参照が Application.Windows コレクションに追加される
458
458
 
459
- 1. Window.Close() メソッドを呼ぶか Application.Shutdown() メソッドを呼ぶとApplication.Windows コレクションから参照除外される
459
+ 1. Window.Close() メソッドを呼ぶか Application.Shutdown() メソッドを呼ぶとApplication.Windows コレクションから参照除外される
460
460
 
461
461
 
462
462
 

15

まとめを追記。

2019/03/22 08:11

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -447,3 +447,23 @@
447
447
  }
448
448
 
449
449
  ```
450
+
451
+ ### まとめ
452
+
453
+ これまでの調査によって、以下のことが明確になりました。
454
+
455
+
456
+
457
+ 1. Window クラスを new するとその参照が Application.Windows コレクションに追加される
458
+
459
+ 1. Window.Close() メソッドを呼ぶか Application.Shutdown() メソッドを呼ぶとApplication.Windows コレクションから参照を除外される
460
+
461
+
462
+
463
+ したがって、new した Window クラスへの参照は、ただ null を代入しても GC されずに残るため、必ず Close() メソッドを呼ぶ必要がある。ただし、「他からの参照」が生き残っているため、Close() メソッドを呼んだだけでは GC の対象にはならない。ある程度時間を(今回の私の環境では 100[ms])置くと「他からの参照」がなくなり、GC の対象となる。
464
+
465
+
466
+
467
+ この質問スレッドもだいぶ文章が長くなってきましたので、「他からの参照」というのが何者なのかについてはここでは追究しません。
468
+
469
+ 今後の調査によってはまた質問を投稿させていただきますので、そのときはまた皆様にご協力いただきたいと思います。中々に濃い内容だったように思いますが、これまでお付き合いいただきありがとうございました。

14

文章を整理。

2019/03/22 06:51

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -1,7 +1,11 @@
1
+ ### 開発環境
2
+
1
3
  Visual Studio 2013、.NET Framework 4.6 で WPF アプリの開発をしています。
2
4
 
3
5
 
4
6
 
7
+ ### 質問内容
8
+
5
9
  下記のようなコードを Release ビルドし、
6
10
 
7
11
  exe から単体で起動したところ、
@@ -202,32 +206,32 @@
202
206
 
203
207
 
204
208
 
209
+ ### 途中経過
210
+
211
+ 調査している中で、App.Windows プロパティが怪しいかと思いましたが、そうではありませんでした。
212
+
213
+ このプロパティは「アプリケーションでインスタンス化されたウィンドウを取得」できるようです。
214
+
215
+ このコレクションは読み取り専用で、クリアしたり各要素に null を代入したりすることができないようです。
216
+
217
+ ただし、Window.Close() メソッドが呼ばれるとそのコレクションから参照が削除されます。[参考ソース](https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Window.cs,4631)
218
+
219
+ よって、App.Windows プロパティに関しては Close() メソッドさえ呼べば問題ないということがわかりました。
220
+
221
+
222
+
205
223
  ---
206
224
 
207
- 調査している中で、App.Windows プロパティが怪いかと思いましたそうではありませんでした。
208
-
209
- このプロパティは「アプリケーションでインスタンス化されたウィンドウを取得」できるようです
210
-
211
- このコレクションは読み取り専用でクリアしたり各要素に null代入したすることきないようです。
212
-
213
- ただし、Window.Close() メソッドが呼ばれるとそのコレクションから参照が削除されます。[参考ソース](https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Window.cs,4631)
214
-
215
- よって、App.Windows プロパティに関しては Close() メソッドさえ呼べば問題ないということがわかりました。
225
+ App.Shutdown() を呼んだ後、OnExit() メソッドをオーバーライドて参照を確認したところ
226
+
227
+ 見事 GC によって破棄されていました。
228
+
229
+ [ソース](https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Application.cs,323f71efbcb142b9)を確認するとDispatcher.BeginInvoke() よって OnExite() メソッド非同期的に呼び出ているめ、これによって後述する状況と同じことになり、たまたま Shutdown() GC されるようになっただけと言えそうです。
216
230
 
217
231
 
218
232
 
219
233
  ---
220
234
 
221
- App.Shutdown() を呼んだ後、OnExit() メソッドをオーバーライドして参照を確認したところ、
222
-
223
- 見事 GC によって破棄されていました。
224
-
225
- [ソース](https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Application.cs,323f71efbcb142b9)を確認すると、Dispatcher.BeginInvoke() によって OnExite() メソッドを非同期的に呼び出しているため、これによって後述する状況と同じことになり、たまたま Shutdown() で GC されるようになっただけと言えそうです。
226
-
227
-
228
-
229
- ---
230
-
231
235
  2019/3/22 13:50 現在、皆様のおかげでここまできました。
232
236
 
233
237
  現在下記のコードにて MainWindow が GC によって回収されることが確認できています。
@@ -443,7 +447,3 @@
443
447
  }
444
448
 
445
449
  ```
446
-
447
-
448
-
449
- Close() メソッドを呼んだ後、なぜ少し時間を置く必要があるのかを教えてください。

13

WM_CLOSE を WM_DESTROY に変更。

2019/03/22 06:39

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  最新の動作確認用コードは一番下にあります。
16
16
 
17
- WM_CLOSE を処理しているにも関わらず GC で回収されないことがあります。
17
+ WM_DESTROY を処理しているにも関わらず GC で回収されないことがあります。
18
18
 
19
19
 
20
20
 
@@ -302,9 +302,9 @@
302
302
 
303
303
 
304
304
 
305
- // WM_CLOSE の確認
305
+ // WM_DESTROY の確認
306
-
306
+
307
- MessageBox.Show("IsClose = " + IsClose);
307
+ MessageBox.Show("IsDestroy = " + IsDestroy);
308
308
 
309
309
 
310
310
 
@@ -338,7 +338,7 @@
338
338
 
339
339
 
340
340
 
341
- public static bool IsClose { get; set; }
341
+ public static bool IsDestroy { get; set; }
342
342
 
343
343
  }
344
344
 
@@ -354,7 +354,7 @@
354
354
 
355
355
 
356
356
 
357
- このことをもう少し詳しく調査するため、WM_CLOSE を捕捉してそのメッセージが投げられたかどうかを確認しましたが、WM_CLOSE は必ず投げられるようで、上記の "IsClose = " のメッセージボックスは常に true となりました。それでも MainWindow が GC されるときとされないときがあることを確認しました。
357
+ このことをもう少し詳しく調査するため、WM_DESTROY を捕捉してそのメッセージが投げられたかどうかを確認しましたが、WM_DESTROY は必ず投げられるようで、上記の "IsDestroy = " のメッセージボックスは常に true となりました。それでも MainWindow が GC されるときとされないときがあることを確認しました。
358
358
 
359
359
  このときの MainWindow.xaml.cs のコードは次のようになります。
360
360
 
@@ -420,11 +420,11 @@
420
420
 
421
421
  {
422
422
 
423
- if (msg == WM_CLOSE)
423
+ if (msg == WM_DESTROY)
424
424
 
425
425
  {
426
426
 
427
- App.IsClose = true;
427
+ App.IsDestroy = true;
428
428
 
429
429
  }
430
430
 
@@ -436,7 +436,7 @@
436
436
 
437
437
 
438
438
 
439
- private const int WM_CLOSE = 0x0010;
439
+ private const int WM_DESTROY = 0x0002;
440
440
 
441
441
  }
442
442
 

12

誤記修正。

2019/03/22 05:36

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -350,7 +350,7 @@
350
350
 
351
351
  MainWindow の Close() メソッドを呼んでから GC.Collect() を呼ぶまでの間に、非同期的に時間を置くことで GC されるようになるようです。
352
352
 
353
- 上記のコードでは 10[ms] しか待っていないため、10 回に 4 回ほどの割合で GC されません。Task.Delay() の時間を(私の環境では 100[ms] に)延ばすとほぼ確実に GC されるようになりました。
353
+ 上記のコードでは 10[ms] しか待っていないため、10 回に 4 回ほどの割合でしか GC されません。Task.Delay() の時間を(私の環境では 100[ms] に)延ばすとほぼ確実に GC されるようになりました。
354
354
 
355
355
 
356
356
 

11

誤記修正。

2019/03/22 05:30

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  最新の動作確認用コードは一番下にあります。
16
16
 
17
- WM_CLOSE を処理する/いに関係なく GC で回収されないことがあります。
17
+ WM_CLOSE を処理しわらず GC で回収されないことがあります。
18
18
 
19
19
 
20
20
 

10

WM_CLOSE に関する補足を追記。

2019/03/22 05:20

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -12,6 +12,12 @@
12
12
 
13
13
 
14
14
 
15
+ 最新の動作確認用コードは一番下にあります。
16
+
17
+ WM_CLOSE を処理する/しないに関係なく GC で回収されないことがあります。
18
+
19
+
20
+
15
21
  ```XAML
16
22
 
17
23
  <!-- App.xaml -->
@@ -296,6 +302,12 @@
296
302
 
297
303
 
298
304
 
305
+ // WM_CLOSE の確認
306
+
307
+ MessageBox.Show("IsClose = " + IsClose);
308
+
309
+
310
+
299
311
  // 生存確認
300
312
 
301
313
  object obj;
@@ -324,6 +336,10 @@
324
336
 
325
337
  }
326
338
 
339
+
340
+
341
+ public static bool IsClose { get; set; }
342
+
327
343
  }
328
344
 
329
345
  }
@@ -334,4 +350,100 @@
334
350
 
335
351
  MainWindow の Close() メソッドを呼んでから GC.Collect() を呼ぶまでの間に、非同期的に時間を置くことで GC されるようになるようです。
336
352
 
337
- 上記のコードでは 10[ms] しか待っていないため、10 回に 4 回ほどの割合で GC されま。Task.Delay() の時間を(私の環境では 100[ms] に)延ばすとほぼ確実に GC されるようになりました。
353
+ 上記のコードでは 10[ms] しか待っていないため、10 回に 4 回ほどの割合で GC されません。Task.Delay() の時間を(私の環境では 100[ms] に)延ばすとほぼ確実に GC されるようになりました。
354
+
355
+
356
+
357
+ このことをもう少し詳しく調査するため、WM_CLOSE を捕捉してそのメッセージが投げられたかどうかを確認しましたが、WM_CLOSE は必ず投げられるようで、上記の "IsClose = " のメッセージボックスは常に true となりました。それでも MainWindow が GC されるときとされないときがあることを確認しました。
358
+
359
+ このときの MainWindow.xaml.cs のコードは次のようになります。
360
+
361
+ ```C#
362
+
363
+ // MainWindow.xaml.cs
364
+
365
+ namespace WpfApplication3
366
+
367
+ {
368
+
369
+ using System;
370
+
371
+ using System.Runtime.InteropServices;
372
+
373
+ using System.Windows;
374
+
375
+ using System.Windows.Interop;
376
+
377
+
378
+
379
+ /// <summary>
380
+
381
+ /// MainWindow.xaml の相互作用ロジック
382
+
383
+ /// </summary>
384
+
385
+ public partial class MainWindow : Window
386
+
387
+ {
388
+
389
+ public MainWindow()
390
+
391
+ {
392
+
393
+ InitializeComponent();
394
+
395
+
396
+
397
+ this.SourceInitialized += OnSourceInitialized;
398
+
399
+ }
400
+
401
+
402
+
403
+ private void OnSourceInitialized(object sender, EventArgs e)
404
+
405
+ {
406
+
407
+ // メッセージ処理をフック
408
+
409
+ var handle = (new WindowInteropHelper(sender as Window)).Handle;
410
+
411
+ var hwndSource = HwndSource.FromHwnd(handle);
412
+
413
+ hwndSource.AddHook(WndProc);
414
+
415
+ }
416
+
417
+
418
+
419
+ private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
420
+
421
+ {
422
+
423
+ if (msg == WM_CLOSE)
424
+
425
+ {
426
+
427
+ App.IsClose = true;
428
+
429
+ }
430
+
431
+
432
+
433
+ return IntPtr.Zero;
434
+
435
+ }
436
+
437
+
438
+
439
+ private const int WM_CLOSE = 0x0010;
440
+
441
+ }
442
+
443
+ }
444
+
445
+ ```
446
+
447
+
448
+
449
+ Close() メソッドを呼んだ後、なぜ少し時間を置く必要があるのかを教えてください。

9

Close() 後に時間を置くと回収されることに関する補足を追記。

2019/03/22 05:19

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -216,15 +216,17 @@
216
216
 
217
217
  見事 GC によって破棄されていました。
218
218
 
219
- ただ、[ソース](https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Application.cs,323f71efbcb142b9)を確認もリースなどの参照除外するようなコードが見当りません
220
-
221
- Shutdown() が呼ばれてから OnExit() メソッドが呼ばれるまでの間に何が起きているのか、
222
-
223
- そのコードはどこにあるのかを教えていただけないでしょうか。
224
-
225
-
226
-
227
- 現在動作確認ているコードは次の通りです。
219
+ [ソース](https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Application.cs,323f71efbcb142b9)を確認すると、Dispatcher.BeginInvoke() によっ OnExite() メッド非同期的に呼び出しているため、これによって後述する状況と同じことになり、たまたま Shutdown() で GC されるようだけと言えそうです
220
+
221
+
222
+
223
+ ---
224
+
225
+ 2019/3/22 13:50 現在、皆様のおかげでここまできました。
226
+
227
+ 現在下記のコードにて MainWindow が GC によって回収されることが確認できていす。
228
+
229
+
228
230
 
229
231
  ```C#
230
232
 
@@ -234,6 +236,8 @@
234
236
 
235
237
  using System;
236
238
 
239
+ using System.Threading.Tasks;
240
+
237
241
  using System.Windows;
238
242
 
239
243
 
@@ -248,7 +252,7 @@
248
252
 
249
253
  {
250
254
 
251
- protected override void OnStartup(StartupEventArgs e)
255
+ protected override async void OnStartup(StartupEventArgs e)
252
256
 
253
257
  {
254
258
 
@@ -262,11 +266,15 @@
262
266
 
263
267
  var w = new MainWindow();
264
268
 
269
+
270
+
265
271
  // 弱参照でウォッチ
266
272
 
267
- _r = new WeakReference<object>(w);
273
+ var r = new WeakReference<object>(w);
274
+
275
+
276
+
268
-
277
+ // ウィンドウを開いて閉じる
269
-
270
278
 
271
279
  w.Show();
272
280
 
@@ -276,9 +284,37 @@
276
284
 
277
285
 
278
286
 
287
+ // 時間をおいてから GC を強制的におこなう
288
+
289
+ await Task.Delay(10);
290
+
291
+ GC.Collect();
292
+
293
+ GC.WaitForPendingFinalizers();
294
+
295
+ GC.Collect();
296
+
297
+
298
+
279
299
  // 生存確認
280
300
 
281
- CheckAlive();
301
+ object obj;
302
+
303
+ if (r.TryGetTarget(out obj))
304
+
305
+ {
306
+
307
+ MessageBox.Show(obj + " を参照中。");
308
+
309
+ }
310
+
311
+ else
312
+
313
+ {
314
+
315
+ MessageBox.Show("参照していません。");
316
+
317
+ }
282
318
 
283
319
 
284
320
 
@@ -288,70 +324,14 @@
288
324
 
289
325
  }
290
326
 
291
-
292
-
293
- protected override void OnExit(ExitEventArgs e)
294
-
295
- {
296
-
297
- //base.OnExit(e);
298
-
299
-
300
-
301
- // 生存確認
302
-
303
- CheckAlive();
304
-
305
- }
306
-
307
-
308
-
309
- private void CheckAlive()
310
-
311
- {
312
-
313
- // GC を強制的におこなう
314
-
315
- GC.Collect();
316
-
317
- GC.WaitForPendingFinalizers();
318
-
319
- GC.Collect();
320
-
321
- MessageBox.Show("GC.Collect() しました。");
322
-
323
-
324
-
325
- // 生存確認
326
-
327
- object obj;
328
-
329
- if (_r.TryGetTarget(out obj))
330
-
331
- {
332
-
333
- MessageBox.Show(obj + " を参照中。");
334
-
335
- obj = null;
336
-
337
- }
338
-
339
- else
340
-
341
- {
342
-
343
- MessageBox.Show("参照していません。");
344
-
345
- }
346
-
347
- }
348
-
349
-
350
-
351
- private WeakReference<object> _r;
352
-
353
327
  }
354
328
 
355
329
  }
356
330
 
357
331
  ```
332
+
333
+
334
+
335
+ MainWindow の Close() メソッドを呼んでから GC.Collect() を呼ぶまでの間に、非同期的に時間を置くことで GC されるようになるようです。
336
+
337
+ 上記のコードでは 10[ms] しか待っていないため、10 回に 4 回ほどの割合で GC されます。Task.Delay() の時間を(私の環境では 100[ms] に)延ばすとほぼ確実に GC されるようになりました。

8

最新の動作確認用コードを追記。

2019/03/22 04:56

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -221,3 +221,137 @@
221
221
  Shutdown() が呼ばれてから OnExit() メソッドが呼ばれるまでの間に何が起きているのか、
222
222
 
223
223
  そのコードはどこにあるのかを教えていただけないでしょうか。
224
+
225
+
226
+
227
+ 現在動作確認しているコードは次の通りです。
228
+
229
+ ```C#
230
+
231
+ namespace WpfApplication3
232
+
233
+ {
234
+
235
+ using System;
236
+
237
+ using System.Windows;
238
+
239
+
240
+
241
+ /// <summary>
242
+
243
+ /// App.xaml の相互作用ロジック
244
+
245
+ /// </summary>
246
+
247
+ public partial class App : Application
248
+
249
+ {
250
+
251
+ protected override void OnStartup(StartupEventArgs e)
252
+
253
+ {
254
+
255
+ base.OnStartup(e);
256
+
257
+
258
+
259
+ this.ShutdownMode = ShutdownMode.OnExplicitShutdown;
260
+
261
+
262
+
263
+ var w = new MainWindow();
264
+
265
+ // 弱参照でウォッチ
266
+
267
+ _r = new WeakReference<object>(w);
268
+
269
+
270
+
271
+ w.Show();
272
+
273
+ w.Close();
274
+
275
+ w = null;
276
+
277
+
278
+
279
+ // 生存確認
280
+
281
+ CheckAlive();
282
+
283
+
284
+
285
+ // 終了
286
+
287
+ this.Shutdown();
288
+
289
+ }
290
+
291
+
292
+
293
+ protected override void OnExit(ExitEventArgs e)
294
+
295
+ {
296
+
297
+ //base.OnExit(e);
298
+
299
+
300
+
301
+ // 生存確認
302
+
303
+ CheckAlive();
304
+
305
+ }
306
+
307
+
308
+
309
+ private void CheckAlive()
310
+
311
+ {
312
+
313
+ // GC を強制的におこなう
314
+
315
+ GC.Collect();
316
+
317
+ GC.WaitForPendingFinalizers();
318
+
319
+ GC.Collect();
320
+
321
+ MessageBox.Show("GC.Collect() しました。");
322
+
323
+
324
+
325
+ // 生存確認
326
+
327
+ object obj;
328
+
329
+ if (_r.TryGetTarget(out obj))
330
+
331
+ {
332
+
333
+ MessageBox.Show(obj + " を参照中。");
334
+
335
+ obj = null;
336
+
337
+ }
338
+
339
+ else
340
+
341
+ {
342
+
343
+ MessageBox.Show("参照していません。");
344
+
345
+ }
346
+
347
+ }
348
+
349
+
350
+
351
+ private WeakReference<object> _r;
352
+
353
+ }
354
+
355
+ }
356
+
357
+ ```

7

Shutdown() メソッドに関する補足を追記。

2019/03/22 00:07

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -211,3 +211,13 @@
211
211
 
212
212
 
213
213
  ---
214
+
215
+ App.Shutdown() を呼んだ後、OnExit() メソッドをオーバーライドして参照を確認したところ、
216
+
217
+ 見事 GC によって破棄されていました。
218
+
219
+ ただ、[ソース](https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Application.cs,323f71efbcb142b9)を確認してもリソースなどの参照を除外するようなコードが見当たりません。
220
+
221
+ Shutdown() が呼ばれてから OnExit() メソッドが呼ばれるまでの間に何が起きているのか、
222
+
223
+ そのコードはどこにあるのかを教えていただけないでしょうか。

6

補足について修正。

2019/03/22 00:00

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -198,8 +198,16 @@
198
198
 
199
199
  ---
200
200
 
201
- 調査している中で、App.Windows プロパティが怪しそうだということがわかってきました。
201
+ 調査している中で、App.Windows プロパティが怪しいかましたが、そではありせんでした。
202
202
 
203
203
  このプロパティは「アプリケーションでインスタンス化されたウィンドウを取得」できるようです。
204
204
 
205
205
  このコレクションは読み取り専用で、クリアしたり各要素に null を代入したりすることができないようです。
206
+
207
+ ただし、Window.Close() メソッドが呼ばれるとそのコレクションから参照が削除されます。[参考ソース](https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Window.cs,4631)
208
+
209
+ よって、App.Windows プロパティに関しては Close() メソッドさえ呼べば問題ないということがわかりました。
210
+
211
+
212
+
213
+ ---

5

App.Windows プロパティについて追記。

2019/03/21 23:30

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -193,3 +193,13 @@
193
193
 
194
194
 
195
195
  一体誰がどこで MainWindow を参照し、GC を妨げているのか教えてください。
196
+
197
+
198
+
199
+ ---
200
+
201
+ 調査している中で、App.Windows プロパティが怪しそうだということがわかってきました。
202
+
203
+ このプロパティは「アプリケーションでインスタンス化されたウィンドウを取得」できるようです。
204
+
205
+ このコレクションは読み取り専用で、クリアしたり各要素に null を代入したりすることができないようです。

4

this.MainWindow = null; の一文を追記。

2019/03/20 07:15

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -89,6 +89,8 @@
89
89
  w.Close();
90
90
 
91
91
  w = null;
92
+
93
+ this.MainWindow = null;
92
94
 
93
95
 
94
96
 

3

ファイナライザ終了オブジェクトも GC するように修正。

2019/03/20 07:07

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -98,6 +98,8 @@
98
98
 
99
99
  GC.WaitForPendingFinalizers();
100
100
 
101
+ GC.Collect();
102
+
101
103
  MessageBox.Show("GC.Collect() しました。");
102
104
 
103
105
 

2

GC でファイナライザの終了を待機するように修正。

2019/03/20 06:51

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -96,6 +96,8 @@
96
96
 
97
97
  GC.Collect();
98
98
 
99
+ GC.WaitForPendingFinalizers();
100
+
99
101
  MessageBox.Show("GC.Collect() しました。");
100
102
 
101
103
 

1

表示しなくても同じ現象となることを追記。

2019/03/20 05:36

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
File without changes
test CHANGED
@@ -170,4 +170,20 @@
170
170
 
171
171
  それほど単純ではないようです。
172
172
 
173
+
174
+
175
+ さらに上記のコードの内、
176
+
177
+ ```C#
178
+
179
+ //w.Show();
180
+
181
+ //w.Close();
182
+
183
+ ```
184
+
185
+ というように、表示すらしないようにしても GC されないようです。
186
+
187
+
188
+
173
189
  一体誰がどこで MainWindow を参照し、GC を妨げているのか教えてください。