gpt4 book ai didi

c# - 使用 WaitOne(100) 与 WaitOne(0) + Task.Delay(100) 等待命名信号量

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:54 25 4
gpt4 key购买 nike

我需要访问由两个进程共享的 Windows 8.1 应用程序中的资源:应用程序本身和后台任务,所以我需要一个命名的 SemaphoreSemaphoreSlim 确实不适用于那里,因为我在获取和发布之间进行异步工作,所以我不能使用 Mutex

我在 PCL 中创建了一个类,它创建了信号量并允许我以这种方式等待 WaitOne 方法:

public sealed class AsyncSemaphore:IDisposable
{
Semaphore _semaphore;
public AsyncSemaphore(int initialCount, int maximumCount, string name)
{
_semaphore = new Semaphore(initialCount, maximumCount, name);
}

public IAsyncOperation<bool> WaitOneAsync()
{
return AsyncInfo.Run<bool>(cancellationToken =>
Task.Run(()=>{
while (!_semaphore.WaitOne(100))
{
Logger.Log("Waiting...");
cancellationToken.ThrowIfCancellationRequested();
}
return true;
},cancellationToken));
}

public int Release()
{
return _semaphore.Release();
}

public void Dispose()
{
if (_semaphore != null)
{
_semaphore.Dispose();
_semaphore = null;
}
}
}

但是WaitOneAsync也可以这样写:

public IAsyncOperation<bool> WaitOneAsync()
{
return AsyncInfo.Run<bool>(async cancellationToken =>
{
while (!_semaphore.WaitOne(0))
{
Logger.Log("Waiting...");
await Task.Delay(100, cancellationToken);
}
return true;
});
}

然后我像这样在我的代码中使用它:

_semaphore= new AsyncSemaphore(1,1,"uniquename");

//....

await _semaphore.WaitOneAsync();
try
{
//do more async work
}
finally
{
_semaphore.Release();
}

这是正确的吗?哪一个最好并且使用的资源更少?

最佳答案

第一个选项在整个等待过程中持有一个线程,首先是同步等待,然后是忙等待(while 循环)。第二种选择至少有点异步,因为它使用Task.Delay 等待,然后才求助于忙等待。

第二个(异步)选项使用较少的资源,但需要等待整个超时(100ms),然后再次检查,而第一个(同步)选项可以在释放时立即进入信号量。

异步选项比同步版本使用更少的资源,但实际同步比同步版本慢。因此,这取决于您的具体需求、可扩展性或速度。


您可以通过将超时从 100ms 降低来进行优化,从而使异步选项越来越接近同步版本。

关于c# - 使用 WaitOne(100) 与 WaitOne(0) + Task.Delay(100) 等待命名信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25382583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com