質問編集履歴

3

エラー周りで現象をもう少し詳しく書いた

2019/03/14 15:32

投稿

nekonekoeditor
nekonekoeditor

スコア13

test CHANGED
File without changes
test CHANGED
@@ -4,11 +4,11 @@
4
4
 
5
5
  UWPのテキストエディターを作っています
6
6
 
7
- このテキストエディタでは定期的にシンタックスハイライトと自動保存の処理を実行していますが、そのタイミングにユーザーによる保存が行われると時々落ちることがあります
7
+ このテキストエディタでは定期的にシンタックスハイライトと自動保存の処理を実行していますが、そのタイミングにユーザーによる保存が行われると時々落ち、デッドロックしてしいま
8
8
 
9
9
  そこで自動保存の時だけ無理やりタイマーを止めるようにしましたが、あまりいい感じがしません
10
10
 
11
- タイマーを止めずにデッドロックを解決する方法があったら教えてほしいです
11
+ タイマーを止めずにこの現象を解決する方法教えてほしいです
12
12
 
13
13
 
14
14
 

2

例外の内容が実際コードで起きるのと違っていた

2019/03/14 15:32

投稿

nekonekoeditor
nekonekoeditor

スコア13

test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- 原因を調べてみると自動保存のタイミングでSynchronizationLockExceptionが投げられていることが分かりました
19
+ 原因を調べてみると自動保存のタイミングでlockrecursionexceptionが投げられていることが分かりました
20
20
 
21
21
 
22
22
 

1

再現できるコードにした

2019/03/14 15:30

投稿

nekonekoeditor
nekonekoeditor

スコア13

test CHANGED
File without changes
test CHANGED
@@ -26,55 +26,79 @@
26
26
 
27
27
  ```C#
28
28
 
29
- //DispatcherTimerを使用している
29
+ /// <summary>
30
30
 
31
- private async void Timer_Tick(object sender, object e)
31
+ /// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。
32
32
 
33
- {
33
+ /// </summary>
34
34
 
35
- this.timer.Stop();
35
+ public sealed partial class MainPage : Page
36
36
 
37
- await SaveAync();
37
+ {
38
38
 
39
- this.timer.Start();
39
+ DispatcherTimer timer = new DispatcherTimer();
40
40
 
41
+ ReaderWriterLockSlim rwlock = new ReaderWriterLockSlim();
42
+
43
+ public MainPage()
44
+
45
+ {
46
+
47
+ this.InitializeComponent();
48
+
49
+ this.timer.Tick += Timer_Tick;
50
+
51
+ this.timer.Interval = new TimeSpan(0,0,1);
52
+
53
+ this.timer.Start();
54
+
41
- }
55
+ }
42
56
 
43
57
 
44
58
 
45
-      private async void SaveCommand()
59
+ private async void Timer_Tick(object sender, object e)
46
60
 
47
- {
61
+ {
48
62
 
49
- await SaveAsync();
63
+ this.timer.Stop();
50
64
 
65
+ await this.SaveAsync();
66
+
67
+ this.timer.Start();
68
+
51
- }
69
+ }
52
70
 
53
71
 
54
72
 
55
- private async Task SaveAsync()
73
+ private async Task SaveAsync()
56
74
 
57
- {
75
+ {
58
76
 
59
- try{
77
+ this.StatusText.Text = "start";
60
78
 
61
- //GUIの要素を操作してプログレスバーを出す
79
+ rwlock.EnterReadLock();
62
80
 
63
- //ReaderLockerSlimeのEnterReadLock()でロックをかける
81
+ await Task.Delay(100); //HeavyWork
64
82
 
65
- //TextReaderのSaveAsync()で保存
83
+ rwlock.ExitReadLock();
66
84
 
67
- }finally{
85
+ this.StatusText.Text = "end";
68
86
 
69
- //ReaderLockerSlimeのExitReadLock()でロック解除
70
-
71
- //GUIの要素を操作してプログレスバーを消す
72
-
73
- }
87
+ }
74
-
75
- }
76
88
 
77
89
 
90
+
91
+ private async void Button_Click(object sender, RoutedEventArgs e)
92
+
93
+ {
94
+
95
+ await this.SaveAsync();
96
+
97
+ this.StatusText.Text = "saved!!!";
98
+
99
+ }
100
+
101
+ }
78
102
 
79
103
  ```
80
104