Silverlight의 HttpWebRequest.BeginGetRequestStream 내에서 UI를 업데이트하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/13217

  •  08-06-2019
  •  | 
  •  

문제

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가 스트리밍을 지원한다고 생각하지 않았습니다. 요청 데이터가 메모리에 완전히 버퍼링되기 때문입니다.그래도 마지막으로 본 지 꽤 시간이 흘렀기 때문에 베타 2가 이를 지원하는지 알아보기 위해 다시 돌아갔습니다.그런데 실제로 그렇습니다.나는 돌아가서 그 말을 하기 전에 읽어서 기쁘다.AllowReadStreamBuffering을 false로 설정하여 활성화할 수 있습니다.HttpWebRequest에서 이 속성을 설정했습니까?이로 인해 차단이 발생할 수 있습니다.

편집하세요. 다른 참고 자료를 찾았습니다.파일을 여러 조각으로 나누어 이 접근 방식을 따를 수도 있습니다.이 내용은 지난 3월에 작성되었으므로 베타 2에서 작동할지 여부는 확실하지 않습니다.

다른 팁

고마워요. 해당 링크를 살펴보겠습니다. 어쨌든 데이터를 청크에 저장하는 것을 고려하고 있었는데, 이것이 합리적인 진행 보고서를 얻을 수 있는 유일한 방법인 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top