代码如下:
int c,cc=4096;
public static ManualResetEvent allDone = new ManualResetEvent(false);
FileStream fs = new FileStream( "file to post",.......);
asyncResult = request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), requestState);
allDone.WaitOne();
allDone.Reset();
c = fs.Read(b, 0, cc);
AsyncCallback callback = new AsyncCallback(WriteCallback);
int n = 0;
while (c > 0)
{
    asyncResult = requestState.dataStream.BeginWrite(b, 0, c, callback, requestState);
    requestState.waitHandle = ThreadPool.RegisterWaitForSingleObject(allDone, new WaitOrTimerCallback(TimeoutCallback), requestState, 3000, true);
    allDone.WaitOne();
    allDone.Reset();
    c = fs.Read(b, 0, cc);
}
requestState.dataStream.Close();//特别留意这句Sleep的调用!!如果没有这一句,随后的EndGetResponse就会挂起
//一旦加上这句,就完全正常了,这是为何?
Thread.Sleep(100);asyncResult = request.BeginGetResponse(new AsyncCallback(GetResponseCallback), requestState);
allDone.WaitOne();
allDone.Reset();
其中的一些callback函数我略掉了,这个程序经过测试,可以正常运行,文件能够正常上传到服务器上。但是今天我特意测试在服务器出错的情况下程序会如何反应,于是我就特意指定了一个会导致HTTP服务器产生“内部服务器错误”(即500错误)的URL,结果程序在BeginGetResponse调用之后就失去反应,只能够杀掉进程。(特别说明:在HTTP服务器不产生错误的情况下,这段程序运行的很好,没有任何问题)经过调试发现应该是在BeginGetResponse的回调函数中调用EndGetResponse的时候死掉了,不知道为何会这样。后来我无意中在BeginGetResponse之前加入了一句Sleep的调用,没想到,只要加上了这么一句Sleep,EndGetResponse马上就恢复正常没有问题了!这到底是为什么?实在让我不解?