class Test {
static int sum = 0;
+ static int count = 0;
static void async_callback (IAsyncResult ar)
{
byte [] buf = (byte [])ar.AsyncState;
- sum += buf [0];
+ Interlocked.Add (ref sum, buf [0]);
+ Interlocked.Increment (ref count);
}
static int Main () {
AsyncCallback ac = new AsyncCallback (async_callback);
IAsyncResult ar;
int sum0 = 0;
+ int count0 = 0;
- FileStream s = new FileStream ("async_read.exe", FileMode.Open);
+ FileStream s = new FileStream ("async_read.exe", FileMode.Open, FileAccess.Read);
s.Position = 0;
- sum0 = 0;
- while (s.Read (buf, 0, 1) == 1)
+ while (s.Read (buf, 0, 1) == 1) {
sum0 += buf [0];
+ count0 ++;
+ }
s.Position = 0;
do {
+ buf = new byte [1];
ar = s.BeginRead (buf, 0, 1, ac, buf);
} while (s.EndRead (ar) == 1);
- sum -= buf [0];
Thread.Sleep (100);
s.Close ();
+ count0 ++; // async_callback is invoked for the "finished reading" case too
Console.WriteLine ("CSUM: " + sum + " " + sum0);
- if (sum != sum0)
+ Console.WriteLine ("Count: " + count + " " + count0);
+ if (sum != sum0 || count != count0)
return 1;
return 0;