gpt4 book ai didi

c# - 如何使用 await/async 等待资源

转载 作者:行者123 更新时间:2023-11-30 16:10:37 24 4
gpt4 key购买 nike

我不完全理解所有 .Net 异步编程概念(等待、异步、等待者、同步上下文等)是如何工作的。

我正在使用套接字,它们需要缓冲区来进行读/写操作,我想要一个 BufferAllocator 对象来搜索和返回缓冲区以供套接字使用。重点是当没有足够的可用内存(缓冲区池为空)时,应用程序应等待缓冲区并在所需内存量可用时继续。

我该如何实现?

好的,这是我的功课(为简单起见只是一个演示,它不是我的真实代码):

class Program
{
private static BufferAllocator _allocator;

static void Main(string[] args)
{
_allocator = new BufferAllocator(100); // 100 bytes
Task.Factory.StartNew(async () =>
{
await _allocator.GetBufferAsync(40); // 100 - 40 = 60bytes
await _allocator.GetBufferAsync(40); // 60 - 40 = 20bytes
await _allocator.GetBufferAsync(40); // 20 < 40 (wait)
Console.WriteLine("Worked!"); // <-------+
}); // |
Console.ReadKey(); // |
_allocator.ReleaseBuffer(40); // after pessing a key, release 40 bytes
Console.ReadKey();
}

}

class BufferAllocator
{
private int _availableBytes;
private SemaphoreSlim _signal = new SemaphoreSlim(0, 1);

public BufferAllocator(int bufferSize)
{
_availableBytes = bufferSize;
}

public async Task GetBufferAsync(int size)
{
while(_availableBytes < size)
await _signal.WaitAsync();

_availableBytes -= size;
}

public void ReleaseBuffer(int size)
{
_availableBytes += size;
_signal.Release();
}
}

注意:会有多个套接字并行读写。请给我一个线索。

最佳答案

当您实际自己实现一个async 构造时,您可能应该使用TaskCompletionSource。将其视为信号对象。它有一个 Task 属性,您可以将其返回给您的客户端以异步方式 await 。然后您使用 TaskCompletionSource 的方法(例如 SetResult)更新任务的状态。这就是一方(生产者)“通知”另一方(该特定任务的消费者)它应该恢复的方式。

如果合适,您当然可以使用内置结构,例如基于大小的 SemaphoreSlimAsyncAutoResetEvent

确保您永远不会忘记完成您的任务(结果是异常(exception)或取消)。否则,您将面临最令人不快的错误/死锁。

关于c# - 如何使用 await/async 等待资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25475974/

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