在WPF中处理两个UI线程c#

时间:2018-02-22 04:55:56

标签: c# wpf multithreading

我有一个UI需要一些时间加载说1分钟或更长时间。现在我需要在后台显示不透明度和进度条以显示正在进行的操作。我们知道两个UI线程无法同时工作,因此我创建了一个新线程来运行进度条

 x = "/ls/ps/ts/00" 

现在最后我需要关闭进度条,即1分钟后。 使用时

  

Thread.Abort的

方法有时会中止该过程,有时需要一些时间(不是一个可靠的解决方案)。 另一种方法是声明DialogProgress类对象全局并在最后关闭窗口。 仍显示错误,

  

"调用线程因为不同而无法访问此对象   线程拥有它"

任何人都可以帮助我解决我的问题。

2 个答案:

答案 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;
        }

    }