执行操作时显示繁忙的加载器
Show busy loader while executing action
我修改了后台worker 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;
}
}
}
并且有初始化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
时,我想向那里传递应该执行的Action,此时应该显示busy Indicator。
我试过了。它似乎有效,但仅适用于 BusyLoader
的首次调用。因为_worker.DoWork
有同样的方法,据我了解
如何为 BusyLoader
的每个新调用更改 _worker.DoWork
方法?或者像那样传递 Action 是一种不好的方法?
你说有帮助所以会 post 评论作为答案
_worker 在第二次调用时不为空,因此 _worker_DoWork 未重新定义。尝试删除和添加。
我修改了后台worker 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;
}
}
}
并且有初始化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
时,我想向那里传递应该执行的Action,此时应该显示busy Indicator。
我试过了。它似乎有效,但仅适用于 BusyLoader
的首次调用。因为_worker.DoWork
有同样的方法,据我了解
如何为 BusyLoader
的每个新调用更改 _worker.DoWork
方法?或者像那样传递 Action 是一种不好的方法?
你说有帮助所以会 post 评论作为答案
_worker 在第二次调用时不为空,因此 _worker_DoWork 未重新定义。尝试删除和添加。