在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进程场景。 –