如何从WPF中的其他线程操作模态对话框?

如何从WPF中的其他线程操作模态对话框?,wpf,multithreading,Wpf,Multithreading,我有一个带有进度条的进度对话框。对话框正在以模式运行。但是有一个后台线程需要改变进度条的值。我正在使用Dispatcher.Invoke来确保没有任何线程冲突。但这只有在对话框是非模态的情况下才有效。对于modal,我猜它会阻塞UI线程和Dispatcher.Invoke,它会在UI线程中等待一些空闲时间,而这将永远不会有空闲时间。我该怎么做?这段代码将创建一个线程和一个窗口,其中会显示一个进度条 System.Threading.ParameterizedThreadStart ts = ne

我有一个带有进度条的进度对话框。对话框正在以模式运行。但是有一个后台线程需要改变进度条的值。我正在使用Dispatcher.Invoke来确保没有任何线程冲突。但这只有在对话框是非模态的情况下才有效。对于modal,我猜它会阻塞UI线程和Dispatcher.Invoke,它会在UI线程中等待一些空闲时间,而这将永远不会有空闲时间。我该怎么做?

这段代码将创建一个线程和一个窗口,其中会显示一个进度条

System.Threading.ParameterizedThreadStart ts = new System.Threading.ParameterizedThreadStart((obj) => {
    System.Threading.Thread.Sleep(1000); // wait a second
    ProgressBar p = obj as ProgressBar;
    if (p != null)
    {
        double min = (double)p.Dispatcher.Invoke(new Func<double>(() => { return p.Minimum; }));
        double max = (double)p.Dispatcher.Invoke(new Func<double>(() => { return p.Maximum; }));
        for (var val = min; val <= max; val++)
        {
            System.Threading.Thread.Sleep(100);
            p.Dispatcher.Invoke(new Action(() => { p.Value = val; }));
        }
    }
});
System.Threading.Thread t = new System.Threading.Thread(ts);

Window w = new Window();
ProgressBar pb = new ProgressBar();
pb.Minimum = 0;
pb.Maximum = 100;
pb.Value = 0;
w.Content = pb;

MessageBox.Show("About to start thread and show dialog");
t.Start(pb);

w.ShowDialog();
MessageBox.Show("Dialog closed");
System.Threading.ParameterizedThreadStart ts=新系统.Threading.ParameterizedThreadStart((obj)=>{
System.Threading.Thread.Sleep(1000);//请稍等
ProgressBar p=作为ProgressBar的obj;
如果(p!=null)
{
double min=(double)p.Dispatcher.Invoke(new Func(()=>{return p.Minimum;}));
double max=(double)p.Dispatcher.Invoke(new Func(()=>{return p.max;}));
对于(var-val=min;val{p.Value=val;}));
}
}
});
System.Threading.Thread t=新的System.Threading.Thread(ts);
窗口w=新窗口();
ProgressBar pb=新的ProgressBar();
pb.最小值=0;
pb.最大值=100;
pb.值=0;
w、 含量=铅;
Show(“即将启动线程并显示对话框”);
t、 启动(pb);
w、 ShowDialog();
MessageBox.Show(“对话框关闭”);

如果我理解您的意思,您可以使用Dispatcher.Invoke和modal。显示模式只会阻止调用它的函数,但同时UI会做出响应(系统禁用的所有者窗口除外),并处理使用Invoke执行的作业。@MaMazav恐怕你误解了我的问题。我说的是线程,不是函数,也不是谁调用谁。我在UI线程中运行了一个模式对话框。但有另一个后台线程正在工作,希望告诉modal在进度条上显示不同的值。根据我的经验,我仍然认为它会工作。UI线程在显示模式窗口时继续处理作业。它不工作。我已经试过了。你能复制你的代码吗?这样我/我们就能准确地理解你的意思以及为什么它不起作用?所以我想我缺少的是progressBar.Dispatcher.Invoke。我改为使用Dispatcher.Invoke?