में 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;
});
}
}