gpt4 book ai didi

c# - 如何从 Silverlight 中的 HttpWebRequest.BeginGetRequestStream 中更新我的 UI

转载 作者:太空狗 更新时间:2023-10-29 23:48:57 24 4
gpt4 key购买 nike

我正在使用 HttpWebRequest 的 BeginGetRequestStream 上传多个文件,但我想更新我在发布数据流时编写的进度控件。

这应该如何完成,我尝试从将数据推送到流中的循环内调用 Dispatch.BeginInvoke(如下所示),但它会锁定浏览器直到完成,所以它似乎处于某种工作/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;
} );
}
}

最佳答案

我要说的是,我不认为 Silverlight 2 的 HttpWebRequest 支持流,因为请求数据被完全缓冲到内存中。自从我上次查看它已经有一段时间了,因此我回去看看 Beta 2 是否支持它。事实证明确实如此。我很高兴在陈述之前我回去阅读了。您可以通过将 AllowReadStreamBuffering 设置为 false 来启用它。您是否在 HttpWebRequest 上设置了此属性?这可能会导致您的阻塞。

编辑,为您找到另一个引用。您可能希望通过将文件分成 block 来遵循这种方法。这是去年三月写的,因此我不确定它是否适用于 Beta 2。

关于c# - 如何从 Silverlight 中的 HttpWebRequest.BeginGetRequestStream 中更新我的 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com