从运行结果可以看出,此时是调用线程池中的I/O线程去执行回调函数的,同时在工程所的的binDebug文件目录下有生成一个text.txt文件,打开文件可以知道里面的内容正是你写入的。
下面演示如何从刚才的文件中异步读取我们写入的内容:
using System;
using System.IO;
using System.Text;
using System.Threading;
namespace AsyncFileRead
{
class Program
{
const int maxsize = 1024;
static byte[] readbytes = new byte[maxsize];
static void Main(string[] args)
{
ThreadPool.SetMaxThreads(1000, 1000);
PrintMessage("Main Thread start");
// 初始化FileStream对象
FileStream filestream = new FileStream("test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 100, false);
// 异步读取文件内容
filestream.BeginRead(readbytes, 0, readbytes.Length, new AsyncCallback(EndReadCallback), filestream);
Console.Read();
}
private static void EndReadCallback(IAsyncResult asyncResult)
{
Thread.Sleep(1000);
PrintMessage("Asynchronous Method start");
// 把AsyncResult.AsyncState转换为State对象
FileStream readstream = (FileStream)asyncResult.AsyncState;
int readlength = readstream.EndRead(asyncResult);
if (readlength <=0)
{
Console.WriteLine("Read error");
return;
}
string readmessage = Encoding.Unicode.GetString(readbytes, 0, readlength);
Console.WriteLine("Read Message is :" + readmessage);
readstream.Close();
}
// 打印线程池信息
private static void PrintMessage(String data)
{
int workthreadnumber;
int iothreadnumber;
// 获得线程池中可用的线程,把获得的可用工作者线程数量赋给workthreadnumber变量
// 获得的可用I/O线程数量给iothreadnumber变量
ThreadPool.GetAvailableThreads(out workthreadnumber, out iothreadnumber);
Console.WriteLine("{0}n CurrentThreadId is {1}n CurrentThread is background :{2}n WorkerThreadNumber is:{3}n IOThreadNumbers is: {4}n",
data,
Thread.CurrentThread.ManagedThreadId,
Thread.CurrentThread.IsBackground.ToString(),
workthreadnumber.ToString(),
iothreadnumber.ToString());
}
}
}
运行结果:

这里有个需要注意的问题:如果大家测试的时候, 应该把开始生成的text.txt文件放到该工程下bindebug目录下, 我刚开始的做的时候就忘记拷过去的, 读出来的数据长度一直为0(这里我犯的错误写下了,希望大家可以注意,也是警惕自己要小心。)










