2016-12-03 29 views
0

我wan't阻止进程之间的一些代码,它主要是针对我的UWP应用程序,但因为它是一个跨平台的项目,这段代码也对Android应用程序执行:Xamarin的Android:Semaphore.TryOpenExisting不工作

if (!Semaphore.TryOpenExisting("some_name", out _semaphore)) 
    _semaphore = new Semaphore(1, 1, "some_name"); 

其中_semaphore是:

private readonly Semaphore _semaphore; 

所以,现在当Semaphore.TryOpenExisting被调用时,我得到以下异常:System.NotSupportedException: Specified method is not supported.

但看着Xamarin Docs它看起来像Semaphore.TryOpenExisting是简单的,我没有看到一些平台上不支持的信息?

我在做什么错了?我应该排除跨平台的Semaphore课程吗?我如何在跨平台的场景中实现它?

+0

你不能使用类似SemaphoreSlim任何理由吗?你需要做什么,这是不能实现的? – Cheesebaron

+0

'SemaphoreSlim'是应用程序内部阻塞的本地信号量,不具备命名信号量的功能。我需要一个名为Semaphore的进程 –

回答

0

因此,因为对于Android我不需要经典的System.Threading.Semaphore类提供的进程间同步,看起来像Xamarin.Android不支持,但我仍然希望在进程中具有命名信号量的功能有一个与我UWP的应用程序一致的行为,我写了下面的辅助类使用SemaphoreSlim类“命名的”锁运行的代码:

class NamedSlimLocker 
{ 
    private static readonly ConcurrentDictionary<string, SemaphoreSlim> _semaphoreSlimDict; 
    static NamedSlimLocker() 
    { 
     _semaphoreSlimDict = new ConcurrentDictionary<string, SemaphoreSlim>(); 
    } 

    private readonly string _name; 
    private readonly SemaphoreSlim _semaphore; 

    public NamedSlimLocker(string name) 
    { 
     this._name = name; 
     _semaphore = _semaphoreSlimDict.GetOrAdd(name, (n) => new SemaphoreSlim(1,1)); 
    } 

    public async Task RunLockedAsync(Func<Task> action) 
    { 
     try 
     { 
      await _semaphore.WaitAsync(); 
      await action(); 
     } 
     finally 
     { 
      _semaphore.Release(); 
     } 
    } 

    public async Task<T> RunLockedAsync<T>(Func<Task<T>> action) 
    { 
     try 
     { 
      await _semaphore.WaitAsync(); 
      return await action(); 
     } 
     finally 
     { 
      _semaphore.Release(); 
     } 
    } 
}