我有一个应用程序,其中我具有可以由多个客户端访问的一个共享的资源(运动系统)。 我有一个需要访问系统的移动和其持续时间,如果在同一时间被要求相互矛盾的操作应该抛出“忙”例外单独操作。 我也有需要获取到几个运营,与其他动作穿插的执行运动系统独占访问排序; 整个序列时,没有其他客户应该能够运行操作。
我历来走近这个使用线程的亲和力,使一个线程可以请求独占访问并运行相应的操作阻塞调用。 虽然线程都可以访问,没有其他线程可以使用的资源。 我现在遇到的问题是,我已经朝着实现异步使用我的系统移动/等待模式,允许清洁序执行。 问题是,现在我的音序器并不总是相同的线程上运行; 活动线程能够回调的过程中发生变化,因此它不再容易确定我是否在有效的情况下继续运行操作。 值得注意的一个项目是,一些操作本身的由等待着的,这意味着这两个序列和个人的操作可以跨越多个线程。
我的问题:是否有人知道一个很好的模式,以应付由于异步收购的线程切换存在独家访问/等待?
作为参考,几件事情我已经考虑:
我可以创建编组所有序要求序列回单个线程的持续时间自定义的SynchronizationContext。 这有让我重用现有的线程亲和力访问管理代码的好处。 缺点是,这将需要专线程每当我做任何一个序列或操作(因为操作也可以跨越多个线程。)
创建一个可获取的访问令牌传递给操作方法,证明你已经取得的访问。 这有腹胀用的令牌参数方法的缺点。
使用由式(2)访问令牌的方法,但创造的操作界面重复接口实现这样的包装可以与令牌“烤入”被实例化。 这产生了一些丑陋的胶水代码,但它清理序代码,以便它不再需要令牌传递给每个方法。