Я изменил фон работник 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
? Или это плохой подход, чтобы пройти такое действие?
Вы прошли через это? При втором использовании '_worker' не будет пустым, не так ли? Установка его в значение null при завершении сбросит ваше состояние. В стороне, отменить нити - плохая идея (см. [Этот вопрос] (например, http://stackoverflow.com/questions/1559255/whats-wrong-with-using-thread-abort/1560567#1560567)). И я не вижу, что '_workerThread' всегда установлен. И вызывать работу над потоком пользовательского интерфейса поражает цель этого полностью - ваш счетчик не будет вращаться. –
Почему вы не используете задачу вместо BackgroundWorker? Кроме того, вы можете использовать «лучший» шаблон с видимостью индикатора выполнения, привязанным к некоторому логическому в вашей модели (или некоторому визуальному состоянию в XAML). –
Aybe
@ Эй, я пробовал подход MVVM для моего счетчика, но это не помогает ... Все работает на потоке пользовательского интерфейса, поэтому я не вижу индикатора занятости – demo