在WP7應用程序中,我使用命名的互斥鎖來同步對StorageFiles和Tiles的訪問。 使用UWP應用程序的異步代碼時,這不再穩健,因爲互斥體是線程仿射的並與異步代碼混合,這會導致錯誤「對象同步方法是從未同步的代碼塊中調用的」。如何同步UWP應用程序與其後臺任務之間的資源訪問?
Using mutex As New Threading.Mutex(False, "SyncAppAndBackTask")
Try
Await ...
Finally
mutex.ReleaseMutex()
End Try
End Using
在這裏不使用SemaphoreSlim,因爲應用程序和後臺任務運行在不同的進程中。
這個post建議使用Taks.Factory.StartNew與TaskCreationOptions.LongRunning或StaTaskScheduler。
LongRunning並未解決問題,因爲我的測試代碼證明了這一點,請參閱here。 我發現StaTaskScheduler的版本使用UWP中不可用的Thread類。
有人有一個解決方案,或至少一個UWP兼容版本的StaTaskScheduler - 在上述Noseratio提到「新線程」可以用Factory.StartNew替換。
作爲一種解決方法,我目前通過.OpenAsync(FileAccessMode.ReadWrite)使用存儲文件鎖定,但這會導致醜陋的重試循環。
沒有,我覺得有一個普遍的問題使用具有異步代碼的命名互斥體。儘管你的鏈接看起來很有趣。但是,這些異步鎖似乎不適用於x進程場景。 –