我有以下代码用于将文件上传到我的ashx页面。它运作得很好,虽然我似乎无法找到一种合适的方式来获得它转移了多少。
主叫代码:
WebClient wc = new WebClient();
wc.OpenWriteCompleted += (s2, e2) =>
{
PushData(e2.Result, offset);
e2.Result.Close();
};
wc.OpenWriteAsync(ub.Uri);
推送数据代码:
private void PushData(Stream output, long offset)
{
byte[] buffer = new byte[4096];
int bytesRead;
bytesRead = theFileStream.Read(buffer, 0, buffer.Length);
if (bytesRead != 0)
{
output.Write(buffer, 0, bytesRead);
totalBytesDone += bytesRead;
FireUpdateEvent(bytesRead);
}
}
为简洁起见,上面的代码与我的实际代码略有不同。
现在,我已经假定当它到达output.Write(buffer,0,bytesRead);
时,它就是发送实际数据的点,并且它会锁定并且只有在完成写入该部分后才转到下一行。但它在向服务器写入任何内容之前会继续totalBytesDone += bytesRead;
。我认为原因是它在后台的一个单独的线程中进行编写(或者我实际上是在查看代码的错误部分并在其他地方写入) - 但是我的totalBytesDone
代码可以工作我< strong>想要它锁定直到它完成发送(我可以把它全部放在一个单独的线程中)。
我已经下载了大量用于执行此操作的示例,他们要么无法正常使用我的ashx文件处理程序(我无法更改),要么使用仅报告50%进度的WebClient方法。