【发布时间】:2014-08-26 21:20:23
【问题描述】:
我不完全理解所有 .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();
}
}
注意:会有多个套接字并行读写。请给我一个线索。
【问题讨论】:
标签: c# .net asynchronous task-parallel-library async-await