Click here to Skip to main content
16,006,452 members
Home / Discussions / C#
   

C#

 
QuestionHow to write a class, where one of its attributes is an Array? Pin
nstk30-Mar-11 2:23
nstk30-Mar-11 2:23 
AnswerRe: How to write a class, where one of its attributes is an Array? PinPopular
Pete O'Hanlon30-Mar-11 2:30
mvePete O'Hanlon30-Mar-11 2:30 
GeneralRe: How to write a class, where one of its attributes is an Array? Pin
nstk3-Apr-11 23:02
nstk3-Apr-11 23:02 
AnswerRe: How to write a class, where one of its attributes is an Array? Pin
David198730-Mar-11 2:46
David198730-Mar-11 2:46 
AnswerRe: How to write a class, where one of its attributes is an Array? Pin
#realJSOP30-Mar-11 7:16
professional#realJSOP30-Mar-11 7:16 
AnswerRe: How to write a class, where one of its attributes is an Array? Pin
davidnz30-Mar-11 10:21
davidnz30-Mar-11 10:21 
GeneralRe: How to write a class, where one of its attributes is an Array? Pin
nstk2-Apr-11 4:40
nstk2-Apr-11 4:40 
QuestionHttpWebRequest load image from rss with UI freezing (windows phone) Pin
peter_piper30-Mar-11 2:09
peter_piper30-Mar-11 2:09 
Hello
I'm some kind of new to c# and tried out a tutorial to download some comic images from an rss feed.
Now I want to optimize the program, so that the UI-Thread isn't blocked anymore. I've read that I should use Backgroundworker und HttpWebRequest instead of WebClient.

Problem: I tried out backgroundworker and httpwebrequest instead of webclient, but the UI is still freezing and I don't really understand why.

Hope somebody can explain me, what I'm doing wrong.

public class FailsViewModel :INotifyPropertyChanged
    {

        static int i = 0;
        public FailsViewModel()
        {
            
            this.Fails = new ObservableCollection<FailViewModel>();

            InitializeBackgoundWorker();
            LoadFailsAsync();
            //_bw.RunWorkerAsync(); // ->bw_DoWork*/
        }

        private void InitializeBackgoundWorker() 
        {
            _bw = new BackgroundWorker();
            _bw.WorkerReportsProgress = true;
            _bw.WorkerSupportsCancellation = true;
            _bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            _bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
            _bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        }

        public void LoadFailsAsync()
        {
                    
                    var request = (HttpWebRequest)WebRequest.Create(new Uri("http://schabus.knor.net/rss"));
            
                    request.BeginGetResponse(r =>
                    {
                        var httpRequest = (HttpWebRequest)r.AsyncState;
                        var httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(r);
                        
                        using (var reader = new StreamReader(httpResponse.GetResponseStream()))
                        {
                            var response = reader.ReadToEnd();

                            //With backgroundworker
                            _bw.RunWorkerAsync(response); //-->doWork 

                            //Without backgroundworker (Load items async then let then let the UI Show the Images)
                            /*Collection<FailViewModel> c = LoadItems(response);

                            Deployment.Current.Dispatcher.BeginInvoke(() =>
                                {
                                    for (int i = 0; i < c.Count; i++)
                                    {
                                        this.Fails.Add(c.ElementAt(i));
                                        //MessageBox.Show("\nTitle: " + Fails.ElementAt(i).Title);
                                        Thread.Sleep(1);
                                    }
                                    MessageBox.Show("fertig - bw_RunWorkerCompleted");
                                });
                             */
                        }
                    }, request);

                    /*
                    WebClient client = new WebClient();
                    client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
                    client.DownloadStringAsync(new Uri ("http://schabus.knor.net/rss", UriKind.Absolute));
                    */
        }


        private Collection<FailViewModel> LoadItems(string e)
        {
            Collection<FailViewModel> fvmc = new Collection<FailViewModel>();

            XElement xel = XElement.Parse(e);

            Collection<FailViewModel> fails = new Collection<FailViewModel>();

            var items = xel.Descendants(XName.Get("item"));

            foreach (var item in items)
            {
                var desc = item.Descendants(XName.Get("encoded", "http://purl.org/rss/1.0/modules/content/")).SingleOrDefault();
                var title = item.Descendants(XName.Get("title")).SingleOrDefault();

                if (desc != null && title != null)
                {
                    string url = desc.Value.Substring(desc.Value.IndexOf("src=\"") + 5);
                    string localUrl = url.Substring(0, url.IndexOf("\""));
                    string absoluteUrl = "http://schabus.knor.net" + localUrl;

                    //add item
                    FailViewModel fvm = new FailViewModel();
                    fvm.Title = title.Value;
                    fvm.Uri = new Uri(absoluteUrl, UriKind.Absolute);
                    fvmc.Add(fvm);
                }
            }
            return fvmc;
        }

        private Collection<FailViewModel> LoadItems_WebRequest(DownloadStringCompletedEventArgs e)
        {
            Collection<FailViewModel> fvmc = new Collection<FailViewModel>();

            XElement xel = XElement.Parse(e.Result);

            Collection<FailViewModel> fails = new Collection<FailViewModel>();
 
            var items = xel.Descendants(XName.Get("item"));

            foreach (var item in items)
            {
                var desc = item.Descendants(XName.Get("encoded", "http://purl.org/rss/1.0/modules/content/")).SingleOrDefault();
                var title = item.Descendants(XName.Get("title")).SingleOrDefault();

                if (desc != null && title != null)
                {
                    string url = desc.Value.Substring(desc.Value.IndexOf("src=\"") + 5);
                    string localUrl = url.Substring(0, url.IndexOf("\""));
                    string absoluteUrl = "http://schabus.knor.net" + localUrl;

                    //add item
                    FailViewModel fvm = new FailViewModel();
                    fvm.Title = title.Value;
                    fvm.Uri = new Uri(absoluteUrl, UriKind.Absolute);
                    fvmc.Add(fvm);
                }
            }
            return fvmc;
        }
        
        #region Properties
        
        private BackgroundWorker _bw = null;

        public volatile bool isComplete = false;
        private ObservableCollection<FailViewModel> _Fails = default(ObservableCollection<FailViewModel>);
        public ObservableCollection<FailViewModel> Fails
        {
            get
            {
                return _Fails;
            }
            set
            {
                _Fails = value;
                OnPropertyChanged("Fails");
            }
        }

        private FailViewModel _SelectedFail = default(FailViewModel);
        public FailViewModel SelectedFail
        {
            get
            {
                return _SelectedFail;
            }
            set
            {
                _SelectedFail = value;
                OnPropertyChanged("SelectedFail");
            }
        }
    #endregion

        protected virtual void OnPropertyChanged(string propertyName)
        { 
            if(this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public event PropertyChangedEventHandler PropertyChanged;

        #region BackgroundWorker
        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            //ohne bgw 
            e.Result = LoadItems((string)e.Argument);//LoadItems((string)e.Result);
            
            //LoadItems((DownloadStringCompletedEventArgs)e.Argument);
        }

        void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
                    //back to ui thread
                    ((WebClient)sender).DownloadStringCompleted -= client_DownloadStringCompleted;

                    if (e.Error == null && e.Cancelled == false)
                    {           
                        MessageBox.Show("DSC-" + (i++) +"\n"+e.Result  );
                        //param e : String in xml
                        _bw.RunWorkerAsync(e); // ->bw_DoWork
                    }
            
        }
        //läuft wieder im UI thread ab!
        private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //add
            Collection<FailViewModel> c = e.Result as Collection<FailViewModel>;

            for(int i=0; i<c.Count;i++)
            {
                this.Fails.Add(c.ElementAt(i));
                //MessageBox.Show("\nTitle: " + Fails.ElementAt(i).Title);
                Thread.Sleep(1);
            }
            
            MessageBox.Show("fertig - bw_RunWorkerCompleted"); //shown *two times* at beginning!!
            //clean
            _bw.DoWork -= bw_DoWork;
            _bw.ProgressChanged -= bw_ProgressChanged;
            _bw.RunWorkerCompleted -= bw_RunWorkerCompleted;
        }

        private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            MessageBox.Show("Progress");
        }
        #endregion

AnswerRe: HttpWebRequest load image from rss with UI freezing (windows phone) Pin
Luc Pattyn30-Mar-11 3:18
sitebuilderLuc Pattyn30-Mar-11 3:18 
GeneralRe: HttpWebRequest load image from rss with UI freezing (windows phone) Pin
peter_piper30-Mar-11 3:42
peter_piper30-Mar-11 3:42 
GeneralRe: HttpWebRequest load image from rss with UI freezing (windows phone) Pin
Luc Pattyn30-Mar-11 3:54
sitebuilderLuc Pattyn30-Mar-11 3:54 
GeneralRe: HttpWebRequest load image from rss with UI freezing (windows phone) Pin
peter_piper4-Apr-11 3:03
peter_piper4-Apr-11 3:03 
AnswerRe: HttpWebRequest load image from rss with UI freezing (windows phone) Pin
Luc Pattyn4-Apr-11 4:57
sitebuilderLuc Pattyn4-Apr-11 4:57 
GeneralRe: HttpWebRequest load image from rss with UI freezing (windows phone) Pin
peter_piper12-Apr-11 4:12
peter_piper12-Apr-11 4:12 
Questionsort generic list collection Pin
arkiboys29-Mar-11 23:41
arkiboys29-Mar-11 23:41 
AnswerRe: sort generic list collection Pin
Pete O'Hanlon29-Mar-11 23:56
mvePete O'Hanlon29-Mar-11 23:56 
GeneralRe: sort generic list collection Pin
arkiboys30-Mar-11 0:18
arkiboys30-Mar-11 0:18 
GeneralRe: sort generic list collection Pin
Shameel30-Mar-11 0:28
professionalShameel30-Mar-11 0:28 
GeneralRe: sort generic list collection Pin
arkiboys30-Mar-11 0:39
arkiboys30-Mar-11 0:39 
GeneralRe: sort generic list collection Pin
Pete O'Hanlon30-Mar-11 1:01
mvePete O'Hanlon30-Mar-11 1:01 
GeneralRe: sort generic list collection Pin
arkiboys30-Mar-11 1:04
arkiboys30-Mar-11 1:04 
AnswerRe: sort generic list collection Pin
davidnz30-Mar-11 0:48
davidnz30-Mar-11 0:48 
GeneralRe: sort generic list collection Pin
davidnz30-Mar-11 1:02
davidnz30-Mar-11 1:02 
AnswerRe: sort generic list collection Pin
Luc Pattyn30-Mar-11 1:19
sitebuilderLuc Pattyn30-Mar-11 1:19 
GeneralRe: sort generic list collection Pin
Pete O'Hanlon30-Mar-11 1:55
mvePete O'Hanlon30-Mar-11 1:55 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.