gpt4 book ai didi

c# - WPF多线程进度对话框

转载 作者:行者123 更新时间:2023-11-30 20:13:07 24 4
gpt4 key购买 nike

已更新 这是我遇到的一个有趣的问题。我需要在后台进程运行时显示一个进度对话框。通常,这会起作用,但问题是我需要在后台进程中设置公共(public)静态数据。这是我试图完成的示例:

public partial class MainWindow : Window{    public static Service binding;    public static Result lr;    public progressDialog dlg;    private void login()    {        string sPwd = txtPwd.Password;        string sEmail = txtEmail.Text;        binding = new Service();        lr = binding.login(sEmail, sPwd);    }    private void btnLogin_Click(object sender, RoutedEventArgs e)    {        BackgroundWorker worker = new BackgroundWorker;        worker.DoWork += new DoWorkEventHandler(worker_DoWork);        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted)        worker.RunWorkerAsync();        dlg = new progressDialog();        dlg.Show();        login();    }    private void worker_DoWork(object sender, DoWorkEventArgs e)    {        e.Result = login();    }    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)    {        this.Hid();        Window1 newWindow = new Window1();        newWindow.Show();        dlg.Close();    }

我知道就目前而言,它不会起作用,因为 login() 是一个空值,并且实际上不会返回一个值以在 DoWork 事件中与 e.Result 一起使用。但是,我已经设置了一个登录类来传递参数,但我仍然收到错误消息,指出我无法访问 UI 线程。主要问题是 lr 和绑定(bind)由另一个窗口访问,因此它们必须是公共(public)静态数据(从另一个窗口我设置 public static Service binding = MainWindow.binding;)。我只是在思考如何准确设置它时遇到了一些麻烦。

最佳答案

你想错了。

你需要在你的主线程中显示你的进度对话框,而不是在你的后台 worker 中。

然后,在 BackgroundWorker.DoWork 处理程序中,您执行实际工作。这在后台线程中运行。

在您的工作进行期间,定期调用 BackgroundWorker.ReportProgress .这会将进度插入 UI 线程。

您需要订阅 BW.ProgressChanged事件,您将在此处更新 progressDialog 中的进度条。这会自动发生在 UI 线程上。

您的工作和对 ReportProgress 的调用需要成为 DoWork 事件处理程序中的唯一内容。

关于c# - WPF多线程进度对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1890518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com