質問編集履歴
3
エラー周りで現象をもう少し詳しく書いた
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
例外の内容が実際コードで起きるのと違っていた
test
CHANGED
File without changes
|
test
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
原因を調べてみると自動保存のタイミングで
|
19
|
+
原因を調べてみると自動保存のタイミングでlockrecursionexceptionが投げられていることが分かりました
|
20
20
|
|
21
21
|
|
22
22
|
|
1
再現できるコードにした
test
CHANGED
File without changes
|
test
CHANGED
@@ -26,55 +26,79 @@
|
|
26
26
|
|
27
27
|
```C#
|
28
28
|
|
29
|
-
|
29
|
+
/// <summary>
|
30
30
|
|
31
|
-
|
31
|
+
/// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。
|
32
32
|
|
33
|
-
|
33
|
+
/// </summary>
|
34
34
|
|
35
|
-
|
35
|
+
public sealed partial class MainPage : Page
|
36
36
|
|
37
|
-
|
37
|
+
{
|
38
38
|
|
39
|
-
|
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
|
-
|
59
|
+
private async void Timer_Tick(object sender, object e)
|
46
60
|
|
47
|
-
|
61
|
+
{
|
48
62
|
|
49
|
-
|
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
|
-
|
73
|
+
private async Task SaveAsync()
|
56
74
|
|
57
|
-
|
75
|
+
{
|
58
76
|
|
59
|
-
|
77
|
+
this.StatusText.Text = "start";
|
60
78
|
|
61
|
-
|
79
|
+
rwlock.EnterReadLock();
|
62
80
|
|
63
|
-
|
81
|
+
await Task.Delay(100); //HeavyWork
|
64
82
|
|
65
|
-
|
83
|
+
rwlock.ExitReadLock();
|
66
84
|
|
67
|
-
|
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
|
|