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

質問編集履歴

3

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

2019/03/14 15:32

投稿

nekonekoeditor
nekonekoeditor

スコア13

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

2

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

2019/03/14 15:32

投稿

nekonekoeditor
nekonekoeditor

スコア13

title CHANGED
File without changes
body CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  ### 発生している問題・エラーメッセージ
9
9
 
10
- 原因を調べてみると自動保存のタイミングでSynchronizationLockExceptionが投げられていることが分かりました
10
+ 原因を調べてみると自動保存のタイミングでlockrecursionexceptionが投げられていることが分かりました
11
11
 
12
12
  ### 該当のソースコード
13
13
 

1

再現できるコードにした

2019/03/14 15:30

投稿

nekonekoeditor
nekonekoeditor

スコア13

title CHANGED
File without changes
body CHANGED
@@ -12,31 +12,43 @@
12
12
  ### 該当のソースコード
13
13
 
14
14
  ```C#
15
- //DispatcherTimerを使用している
15
+ /// <summary>
16
+ /// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。
17
+ /// </summary>
16
- private async void Timer_Tick(object sender, object e)
18
+ public sealed partial class MainPage : Page
17
- {
19
+ {
20
+ DispatcherTimer timer = new DispatcherTimer();
21
+ ReaderWriterLockSlim rwlock = new ReaderWriterLockSlim();
22
+ public MainPage()
23
+ {
18
- this.timer.Stop();
24
+ this.InitializeComponent();
19
- await SaveAync();
25
+ this.timer.Tick += Timer_Tick;
26
+ this.timer.Interval = new TimeSpan(0,0,1);
20
- this.timer.Start();
27
+ this.timer.Start();
21
- }
28
+ }
22
29
 
23
-      private async void SaveCommand()
30
+ private async void Timer_Tick(object sender, object e)
24
- {
31
+ {
32
+ this.timer.Stop();
25
- await SaveAsync();
33
+ await this.SaveAsync();
34
+ this.timer.Start();
26
- }
35
+ }
27
36
 
28
- private async Task SaveAsync()
37
+ private async Task SaveAsync()
29
- {
38
+ {
30
- try{
31
- //GUIの要素を操作してプログレスバーを出す
39
+ this.StatusText.Text = "start";
32
- //ReaderLockerSlimeのEnterReadLock()でロックをかける
40
+ rwlock.EnterReadLock();
41
+ await Task.Delay(100); //HeavyWork
42
+ rwlock.ExitReadLock();
33
- //TextReaderのSaveAsync()で保存
43
+ this.StatusText.Text = "end";
34
- }finally{
35
- //ReaderLockerSlimeのExitReadLock()でロック解除
36
- //GUIの要素を操作してプログレスバーを消す
37
- }
44
+ }
38
- }
39
45
 
46
+ private async void Button_Click(object sender, RoutedEventArgs e)
47
+ {
48
+ await this.SaveAsync();
49
+ this.StatusText.Text = "saved!!!";
50
+ }
51
+ }
40
52
  ```
41
53
 
42
54
  ### 試したこと