public void PostTryReceive(int timeout, int n)
{
// Given
var received = 0L;
var mb = MailboxProcessor.Start<IOption<int>>(async inbox =>
{
while (Interlocked.Read(ref received) < n)
{
var msgOpt = await inbox.TryReceive(timeout);
if (msgOpt == null)
{
var numReceived = Interlocked.Read(ref received);
if (numReceived % 100 == 0)
Trace.WriteLine(string.Format("timeout!, received = {0}", numReceived));
}
else
{
Interlocked.Increment(ref received);
}
}
});
// When
for (var i = 0; i < n; i++)
{
Thread.Sleep(1);
mb.Post(Option.Some(i));
}
// Then
while (Interlocked.Read(ref received) < n)
{
var numReceived = Interlocked.Read(ref received);
if (numReceived%100 == 0)
Trace.WriteLine(string.Format("received = {0}", numReceived));
Thread.Sleep(1);
}
Assert.Equal(n, received);
}