我使用HttpWebRequest的BeginGetRequestStream上传多个文件,但我想更新我在发布数据流时编写的进度控件。
如何做到这一点,我已经尝试从将数据推送到流中的循环中调用Dispatch.BeginInvoke(如下所示)但是它锁定浏览器直到它完成所以它似乎在某种类型的worker / ui线程死锁。
这是我正在做的事情的代码片段:
class RequestState
{
public HttpWebRequest request; // holds the request
public FileDialogFileInfo file; // store our file stream data
public RequestState( HttpWebRequest request, FileDialogFileInfo file )
{
this.request = request;
this.file = file;
}
}
private void UploadFile( FileDialogFileInfo file )
{
UriBuilder ub = new UriBuilder( app.receiverURL );
ub.Query = string.Format( "filename={0}", file.Name );
// Open the selected file to read.
HttpWebRequest request = (HttpWebRequest)WebRequest.Create( ub.Uri );
request.Method = "POST";
RequestState state = new RequestState( request, file );
request.BeginGetRequestStream( new AsyncCallback( OnUploadReadCallback ), state );
}
private void OnUploadReadCallback( IAsyncResult asynchronousResult )
{
RequestState state = (RequestState)asynchronousResult.AsyncState;
HttpWebRequest request = (HttpWebRequest)state.request;
Stream postStream = request.EndGetRequestStream( asynchronousResult );
PushData( state.file, postStream );
postStream.Close();
state.request.BeginGetResponse( new AsyncCallback( OnUploadResponseCallback ), state.request );
}
private void PushData( FileDialogFileInfo file, Stream output )
{
byte[] buffer = new byte[ 4096 ];
int bytesRead = 0;
Stream input = file.OpenRead();
while( ( bytesRead = input.Read( buffer, 0, buffer.Length ) ) != 0 )
{
output.Write( buffer, 0, bytesRead );
bytesReadTotal += bytesRead;
App app = App.Current as App;
int totalPercentage = Convert.ToInt32( ( bytesReadTotal / app.totalBytesToUpload ) * 100 );
// enabling the following locks up my UI and browser
Dispatcher.BeginInvoke( () =>
{
this.ProgressBarWithPercentage.Percentage = totalPercentage;
} );
}
}
答案 0 :(得分:1)
我打算说,我不认为Silverlight 2的HttpWebRequest支持流式传输,因为请求数据完全被缓冲到内存中。自从我上次看到它以来已经有一段时间了,因此我回过头来看看Beta 2是否支持它。事实证明它确实如此。我很高兴我在说明之前回过头来阅读。您可以通过将AllowReadStreamBuffering设置为false来启用它。你在HttpWebRequest上设置了这个属性吗?这可能会导致你阻止。
编辑,找到了另一个参考资料。您可能希望通过将文件分成块来遵循此方法。这是在去年三月写的,因此我不确定它是否能在Beta 2中运行。
答案 1 :(得分:0)
谢谢你,我会看看这些链接,我正在考虑将数据分块,似乎是我能从中得到任何合理进度报告的唯一方法。