2008-08-16 10 views
5

में HttpWebRequest.BeginGetRequestStream के भीतर से अपना यूआई कैसे अपडेट करूं? मैं HttpWebRequest के BeginGetRequestStream का उपयोग करके कई फाइलें अपलोड कर रहा हूं लेकिन मैं डेटा स्ट्रीम पोस्ट करते समय मैंने जो प्रगति नियंत्रण लिखा है, उसे अपडेट करना चाहता हूं।मैं सिल्वरलाइट

यह कैसे किया जाना चाहिए, मैंने लूप के भीतर से डिस्पैच.बिनिन इनवोक (नीचे के रूप में) को कॉल करने का प्रयास किया है जो डेटा को स्ट्रीम में धक्का देता है लेकिन यह ब्राउज़र समाप्त होने तक ब्राउज़र को लॉक करता है, इसलिए ऐसा लगता है कि यह किसी प्रकार के कार्यकर्ता में है/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; 
     }); 
    } 
} 

उत्तर

1

मुझे लगता है कि कहने के लिए जा रहा था, मुझे नहीं लगता था कि Silverlight 2 के HttpWebRequest समर्थित स्ट्रीमिंग, अनुरोध डेटा में बफ़र हो जाता है क्योंकि पूरी तरह से स्मृति। यह थोड़ी देर के बाद से मैंने देखा था, इसलिए मैं यह देखने के लिए वापस गया कि बीटा 2 ने इसका समर्थन किया है या नहीं। ठीक है यह करता है। मुझे खुशी है कि मैं वापस गया और कहने से पहले पढ़ा। आप AllowReadStreamBuffering को गलत पर सेट करके इसे सक्षम कर सकते हैं। क्या आपने इस संपत्ति को अपने HttpWebRequest पर सेट किया था? यह आपके ब्लॉक का कारण बन सकता है।

संपादित करें, आप के लिए एक और संदर्भ पाया। आप फ़ाइल को टुकड़ों में तोड़कर इस दृष्टिकोण का पालन करना चाह सकते हैं। यह पिछले मार्च में लिखा गया था, इसलिए मुझे यकीन नहीं है कि यह बीटा 2 में काम करेगा या नहीं।

0

इसके लिए धन्यवाद, मैं उन लिंक पर एक नज़र डालेगा, मैं अपने डेटा को तोड़ने पर विचार कर रहा था, ऐसा लगता है कि मुझे इससे कोई उचित प्रगति रिपोर्ट मिल सकती है।