[英]Thread-safe async byte queue
我有一個回調方法,只要有新數據就會調用它:
public delegate void DataCallback(
byte[] buffer,
int offset,
int count);
我想將它包裝在一個實現類似於此的接口的類中:
public interface IDataSource
{
IAsyncResult BeginRead(
byte[] buffer,
int offset,
int size,
TimeSpan timeout,
AsyncCallback callback,
object state);
int EndRead(
IAsyncResult asyncResult);
int Read(
byte[] buffer,
int offset,
int size,
TimeSpan timeout);
}
這顯然是一個典型的生產者 - 消費者問題:字節是通過調用回調方法產生的,並由Begin / EndRead和Read方法使用。 如果沒有可用的數據,則應該阻止Begin / EndRead和Read方法(直到發生超時)。 實現應該使用固定大小的內部緩沖區,因此當緩沖區當前已滿時,回調方法需要阻塞。
由於考慮多線程通常會導致嚴重的問題,我的問題是: 是否已經實現了這樣的數據結構?
(我想實現的讀法應該是很簡單的,但我想,以避免執行開始/ EndRead與讀取。 Begin
/ EndInvoke
。)
是否必須通過IAsyncResult
異步? 我這里有一個通用的阻塞隊列(即讀取器阻塞直到有數據或它被關閉;寫入器阻塞直到有空間); 它沒有專門針對byte[]
進行優化,但只要大小不大就應該應對 - 但作為阻塞隊列,它需要(至少一個)專用的消費者線程,執行:
T val;
while(queue.TryDequeue(out val)) {
// process val
}
我認為你應該在“無鎖隊列”上進行谷歌搜索。 我有很多有用的點擊方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.