質問編集履歴
3
エラー周りで現象をもう少し詳しく書いた
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
例外の内容が実際コードで起きるのと違っていた
title
CHANGED
File without changes
|
body
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
|
8
8
|
### 発生している問題・エラーメッセージ
|
9
9
|
|
10
|
-
原因を調べてみると自動保存のタイミングで
|
10
|
+
原因を調べてみると自動保存のタイミングでlockrecursionexceptionが投げられていることが分かりました
|
11
11
|
|
12
12
|
### 該当のソースコード
|
13
13
|
|
1
再現できるコードにした
title
CHANGED
File without changes
|
body
CHANGED
@@ -12,31 +12,43 @@
|
|
12
12
|
### 該当のソースコード
|
13
13
|
|
14
14
|
```C#
|
15
|
-
|
15
|
+
/// <summary>
|
16
|
+
/// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。
|
17
|
+
/// </summary>
|
16
|
-
|
18
|
+
public sealed partial class MainPage : Page
|
17
|
-
|
19
|
+
{
|
20
|
+
DispatcherTimer timer = new DispatcherTimer();
|
21
|
+
ReaderWriterLockSlim rwlock = new ReaderWriterLockSlim();
|
22
|
+
public MainPage()
|
23
|
+
{
|
18
|
-
|
24
|
+
this.InitializeComponent();
|
19
|
-
|
25
|
+
this.timer.Tick += Timer_Tick;
|
26
|
+
this.timer.Interval = new TimeSpan(0,0,1);
|
20
|
-
|
27
|
+
this.timer.Start();
|
21
|
-
|
28
|
+
}
|
22
29
|
|
23
|
-
|
30
|
+
private async void Timer_Tick(object sender, object e)
|
24
|
-
|
31
|
+
{
|
32
|
+
this.timer.Stop();
|
25
|
-
|
33
|
+
await this.SaveAsync();
|
34
|
+
this.timer.Start();
|
26
|
-
|
35
|
+
}
|
27
36
|
|
28
|
-
|
37
|
+
private async Task SaveAsync()
|
29
|
-
|
38
|
+
{
|
30
|
-
try{
|
31
|
-
|
39
|
+
this.StatusText.Text = "start";
|
32
|
-
|
40
|
+
rwlock.EnterReadLock();
|
41
|
+
await Task.Delay(100); //HeavyWork
|
42
|
+
rwlock.ExitReadLock();
|
33
|
-
|
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
|
### 試したこと
|