【发布时间】:2011-02-22 00:26:30
【问题描述】:
我有下面的代码,用于将文件上传到我的 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 代码工作我 希望它在完成发送之前一直锁定(我可以稍后将这一切放在一个单独的线程中)。
我已经下载了大量执行此操作的示例,它们要么不能与我的 ashx 文件处理程序正常工作(我无法更改),要么他们使用只报告 50% 进度的 WebClient 方法。
【问题讨论】:
标签: c# silverlight file-upload webclient