2016-01-04 2 views
0

Я изменил фон работник private AbortableBackgroundWorker _worker;Показать занят погрузчик при выполнении действия

public class AbortableBackgroundWorker : BackgroundWorker 
{ 
    //Internal Thread 
    private Thread _workerThread; 

    protected override void OnDoWork(DoWorkEventArgs e) 
    { 
     try 
     { 
      base.OnDoWork(e); 
     } 
     catch (ThreadAbortException) 
     { 
      e.Cancel = true; //We must set Cancel property to true! 
      Thread.ResetAbort(); //Prevents ThreadAbortException propagation 
     } 
    } 

    public void Abort() 
    { 
     if (_workerThread != null) 
     { 
      _workerThread.Abort(); 
      _workerThread = null; 
     } 
    } 
} 

И есть метод, который INIT BgWorker

private void BusyLoader(Action doWorkAction) 
    { 
     if (_worker == null) 
     { 
      _worker = new AbortableBackgroundWorker(); 
      _worker.WorkerReportsProgress = true; 
      _worker.WorkerSupportsCancellation = true; 
      _worker.DoWork += (sender, e) => _worker_DoWork(sender, e, doWorkAction); 
      _worker.RunWorkerCompleted += _worker_RunWorkerCompleted; 
     } 

     if (!_worker.IsBusy) 
      _worker.RunWorkerAsync(); 
    } 

private void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      loadingPanel.StopSpin(); 
      _worker.Abort(); 
      _worker.Dispose(); 
     } 

     private void _worker_DoWork(object sender, DoWorkEventArgs e, Action action) 
     { 
      loadingPanel.StartSpin(); 
      this.Dispatcher.Invoke(action); 
     } 

Когда я вызываю метод BusyLoader Я хочу передать там Действие, которое должно быть и в это время должен отображаться индикатор занятости.

Я пробовал. И, похоже, это работает, но только для первого вызова BusyLoader. Потому что _worker.DoWork имеет тот же метод, как я понимаю.

Как я могу изменить метод _worker.DoWork для каждого нового вызова BusyLoader? Или это плохой подход, чтобы пройти такое действие?

+0

Вы прошли через это? При втором использовании '_worker' не будет пустым, не так ли? Установка его в значение null при завершении сбросит ваше состояние. В стороне, отменить нити - плохая идея (см. [Этот вопрос] (например, http://stackoverflow.com/questions/1559255/whats-wrong-with-using-thread-abort/1560567#1560567)). И я не вижу, что '_workerThread' всегда установлен. И вызывать работу над потоком пользовательского интерфейса поражает цель этого полностью - ваш счетчик не будет вращаться. –

+2

Почему вы не используете задачу вместо BackgroundWorker? Кроме того, вы можете использовать «лучший» шаблон с видимостью индикатора выполнения, привязанным к некоторому логическому в вашей модели (или некоторому визуальному состоянию в XAML). – Aybe

+0

@ Эй, я пробовал подход MVVM для моего счетчика, но это не помогает ... Все работает на потоке пользовательского интерфейса, поэтому я не вижу индикатора занятости – demo

ответ

0

Вы сказали, что это помогло так разместим комментарий как ответ

_worker не нуль на второй вызов так _worker_DoWork не переопределяется. Попробуйте удалить и добавить.

+0

или как @CharlesMager сказал - проще установить «null» для рабочего – demo

+0

OK. Эффективно добавлять и удалять _worker_DoWork. И я чувствовал, что это лучше продемонстрировало проблему. – Paparazzi

Смежные вопросы