我有一个UI需要一些时间加载说1分钟或更长时间。现在我需要在后台显示不透明度和进度条以显示正在进行的操作。我们知道两个UI线程无法同时工作,因此我创建了一个新线程来运行进度条
x = "/ls/ps/ts/00"
现在最后我需要关闭进度条,即1分钟后。 使用时
Thread.Abort的
方法有时会中止该过程,有时需要一些时间(不是一个可靠的解决方案)。 另一种方法是声明DialogProgress类对象全局并在最后关闭窗口。 仍显示错误,
"调用线程因为不同而无法访问此对象 线程拥有它"
任何人都可以帮助我解决我的问题。
答案 0 :(得分:0)
你必须这样做。为对话框创建一些变量:
private DialogProgress _dialogProgress;
然后启动一个线程并分配该变量:
var thread = new Thread(() => {
_dialogProgress = new DialogProgress();
_dialogProgress.Closed += (sender, args) => {
// when window is closed - shutdown dispatcher
_dialogProgress.Dispatcher.InvokeShutdown();
};
_dialogProgress.Show();
// run dispatcher (message pump) on this thread
System.Windows.Threading.Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
然后当你完成后,关闭这样的窗口:
_dialogProgress.Dispatcher.Invoke(() => _dialogProgress.Close());
_dialogProgrses.Dispatcher
将允许您访问您创建的其他线程的调度程序,因此将在正确的UI线程上调用_dialogProgress.Close()
。窗口关闭后,我们在一个线程中设置的处理程序将关闭该线程的调度程序,整个线程将正常结束,不会中止。
答案 1 :(得分:0)
这就是我找到解决问题的方法。
DialogProgress dialogProgress = null;
private void ShowProgressBar()
{
dialogProgress = new DialogProgress("ATAM Desktop", "Loading module...");
dialogProgress.Show();
}
private void LoadProgressBar(Thread thread)
{
lock (lockProcessStart)
{
if (dialogProgress == null)
{
LayoutRoot.Opacity = 0.9;
LayoutRoot.Refresh();
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
}
}
private void UnloadProgressBar(Thread thread, bool isSave = false)
{
lock (lockProcessStart)
{
if (dialogProgress != null)
Dispatcher.FromThread(thread).Invoke(new Action(() => dialogProgress.Close()));
dialogProgress = null;
if (isSave)
LayoutRoot.Opacity = 1;
}
}