前提・実現したいこと
UWPのテキストエディターを作っています
このテキストエディタでは定期的にシンタックスハイライトと自動保存の処理を実行していますが、そのタイミングにユーザーによる保存が行われると時々落ちたり、デッドロックしてしまいます
そこで自動保存の時だけ無理やりタイマーを止めるようにしましたが、あまりいい感じがしません
タイマーを止めずにこの現象を解決する方法を教えてほしいです
発生している問題・エラーメッセージ
原因を調べてみると自動保存のタイミングでlockrecursionexceptionが投げられていることが分かりました
該当のソースコード
C#
1 /// <summary> 2 /// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。 3 /// </summary> 4 public sealed partial class MainPage : Page 5 { 6 DispatcherTimer timer = new DispatcherTimer(); 7 ReaderWriterLockSlim rwlock = new ReaderWriterLockSlim(); 8 public MainPage() 9 { 10 this.InitializeComponent(); 11 this.timer.Tick += Timer_Tick; 12 this.timer.Interval = new TimeSpan(0,0,1); 13 this.timer.Start(); 14 } 15 16 private async void Timer_Tick(object sender, object e) 17 { 18 this.timer.Stop(); 19 await this.SaveAsync(); 20 this.timer.Start(); 21 } 22 23 private async Task SaveAsync() 24 { 25 this.StatusText.Text = "start"; 26 rwlock.EnterReadLock(); 27 await Task.Delay(100); //HeavyWork 28 rwlock.ExitReadLock(); 29 this.StatusText.Text = "end"; 30 } 31 32 private async void Button_Click(object sender, RoutedEventArgs e) 33 { 34 await this.SaveAsync(); 35 this.StatusText.Text = "saved!!!"; 36 } 37 }
試したこと
SemaphorSlimだとデッドロック発生する
補足情報(FW/ツールのバージョンなど)
{
"dependencies": {
"HockeySDK.UWP": "4.1.6",
"Microsoft.NETCore.UniversalWindowsPlatform": "5.3.3",
"Microsoft.Toolkit.Uwp.Notifications": "1.4.1",
"Prism.Unity": "6.3.0",
"Prism.Windows": "6.3.0",
"System.Text.Encoding.CodePages": "4.3.0",
"WinRTXamlToolkit.UWP": "2.3.0"
},
"frameworks": {
"uap10.0.15063": {}
},
"runtimes": {
"win10-arm": {},
"win10-arm-aot": {},
"win10-x86": {},
"win10-x86-aot": {},
"win10-x64": {},
"win10-x64-aot": {}
}
}
回答2件
あなたの回答
tips
プレビュー