locked
многопоточное выполнение. как? RRS feed

  • Вопрос

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

    погуглил, попробовал BackgroundWorker и Dispatcher.BeginInvoke(() => { ... });  ниче не помогло, вполне возможно из-за того, что я не так что-то написал..


    • Изменено K_K 6 мая 2012 г. 23:27
    6 мая 2012 г. 22:55

Ответы

  • Переставьте сами вычисления из  Button1_Click в bw_DoWork. Именно метод bw_DoWork выполняется в отдельном потоке, а у вас сейчас он вхолостую работает.
    • Помечено в качестве ответа K_K 7 мая 2012 г. 17:54
    7 мая 2012 г. 14:18

Все ответы

  • Покажите свой код с BackgroundWorker и Dispatcher.BeginInvoke(() => { ... });. Должно было помочь.
    • Изменено PashaPash 7 мая 2012 г. 11:45
    7 мая 2012 г. 11:44
  • код Dispatcher'a выглядел так:

    public void Button1_Click()
            {            
                Dispatcher.BeginInvoke(() => 
                {  
                //изменение внешнего вида кнопки
                });
       //вычисления
            }

    а BgWorker выглядел в точности, как тут http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

    c такими изменениями:

    private void bw_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; if ((worker.CancellationPending == true)) { e.Cancel = true; } else { Dispatcher.BeginInvoke(() => { //изменение внешнего вида кнопки

    //а Dispatcher потому, что доступа у этого потока к потоку UI нет }); } }


    соответственно запускался поток так:

     public void Button1_Click()
            {
                BackgroundWorker 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);
    
                if (bw.IsBusy != true)
                {
                    bw.RunWorkerAsync();
                }
                //вычисления
            }



    7 мая 2012 г. 13:27
  • Переставьте сами вычисления из  Button1_Click в bw_DoWork. Именно метод bw_DoWork выполняется в отдельном потоке, а у вас сейчас он вхолостую работает.
    • Помечено в качестве ответа K_K 7 мая 2012 г. 17:54
    7 мая 2012 г. 14:18
  • помогло) спасибо
    7 мая 2012 г. 17:54