public void Dispose()
{
if (isDisposing)
return;
else
isDisposing = true;
dataSemaphore.WaitOne();
data = null;
readPosition = 0;
writePosition = 0;
dataSemaphore.Release();
//may trigger a waiting
waitForNewData.Set();
}