Сведения о вопросе

PIRLO

23:42, 29th August, 2020

Теги

c#   silverlight    

Как обновить мой UI изнутри HttpWebRequest.BeginGetRequestStream в Silverlight

Просмотров: 222   Ответов: 2

Я загружаю несколько файлов, используя BeginGetRequestStream из HttpWebRequest, но я хочу обновить контроль выполнения, который я написал, Пока я публикую поток данных.

Как это должно быть сделано, я попытался вызвать Dispatch.BeginInvoke (как показано ниже) из цикла, который толкает данные в поток, но он блокирует браузер до его завершения, поэтому он, похоже, находится в каком-то тупике рабочего потока/пользовательского интерфейса.

Это фрагмент кода в значительной степени то, что я делаю:

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;
        } );
    }
}



  Сведения об ответе

DO__IT

00:05, 15th August, 2020

Я собирался сказать, что не думаю, что Silverlight 2 HttpWebRequest поддерживает потоковую передачу, потому что данные запроса полностью буферизуются в памяти. Однако прошло уже довольно много времени с тех пор, как я в последний раз смотрел на него, поэтому я вернулся, чтобы посмотреть, поддерживает ли его бета-2. Ну получается, что он делает. Я рад, что вернулся и прочитал, прежде чем заявить об этом. Вы можете включить его, установив значение AllowReadStreamBuffering в false. Вы установили это свойство на свой HttpWebRequest? Это может быть причиной вашего блока.

Отредактируйте, нашел другую ссылку для вас. Вы можете следовать этому подходу, разбивая файл на куски. Это было написано в марте прошлого года, поэтому я не уверен, будет ли он работать в бета-версии 2 или нет.


  Сведения об ответе

lool

13:45, 7th August, 2020

Спасибо за это, я взгляну на эти ссылки, я все равно рассматривал возможность фрагментации своих данных, похоже, это единственный способ получить какие-либо разумные отчеты о ходе работы.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться