كيف أقوم بتحديث واجهة المستخدم من داخل HttpWebRequest.BeginGetRequestStream في سيلفرلايت

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

  •  08-06-2019
  •  | 
  •  

سؤال

أنا تحميل ملفات متعددة باستخدام BeginGetRequestStream من HttpWebRequest ولكن أريد تحديث مراقبة التقدم كتبت بينما أنا بعد ما يصل دفق البيانات.

كيف ينبغي أن يتم هذا, لقد حاولت الاتصال الإرسال.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?التي يمكن أن تسبب كتلة الخاص بك.

تحرير وجدت إشارة أخرى بالنسبة لك.قد ترغب في اتباع هذا النهج عن طريق كسر ملف إلى قطع.هذه كانت مكتوبة في مارس / آذار الماضي, لذلك أنا لست متأكدا مما إذا كان سوف يعمل في بيتا 2 أم لا.

نصائح أخرى

شكرا على هذا ، سوف نلقي نظرة على تلك الروابط, كنت تفكر في تجزئة البيانات على أي حال ، يبدو أن الطريقة الوحيدة التي يمكنني الحصول على أي تقارير مرحلية للخروج منه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top