gpt4 book ai didi

c# - 从主线程调用 WPF 窗口中的方法

转载 作者:太空宇宙 更新时间:2023-11-03 13:30:51 26 4
gpt4 key购买 nike

用例
我正在用 C# 开发一个小应用程序,它被另一个应用程序调用以从 Internet 检索数据。它作为一个进程独立运行,但几乎所有与它的交互都由调用应用程序管理。因此它没有 GUI。但是,我想使用 WPF 添加一个进度条,在某些可能需要一分钟的数据检索期间显示该进度条。估算已完成的工作量和剩余的工作量相当容易,因此我找到了合适的进度条。

研究完成
在阅读了 Albahari 关于线程的大部分 pdf ( http://www.albahari.info/threading/threading.pdf ) 之后,我对线程有了相当的了解。在这个问题上,我也阅读了很多关于 SO 和 MSDN 的帖子。大多数帖子建议使用后台 worker 来进行耗时的数据检索,同时将 GUI 保留在主线程中,因此建议使用后台 worker 的解决方案。不过,在这种情况下感觉很尴尬,因为主要任务是数据检索而不是 GUI 交互。

我花了很多时间试图理解不同的教程和论坛帖子,同时试图使它们符合我的问题,但我没有成功,现在我几乎回到了原点。基本上我想以下面概述的以下两个类结束:

进度条窗口

public partial class ProgressBarWindow : Window
{
public ProgressBarWindow()
{
InitializeComponent();
}

public void setValue(int value)
{
// This function should be available from the main thread
}
}

查询器

Public class Querier
{



public List<Item> getItems()
{
// call ProgressBarWindow.setValue(0);
...
// call ProgressBarWindow.setValue(100);
// call ProgressBarWindow.Close();
}
}

据我了解,UI 必须在单线程下运行,因此我的 ProgressBarWindow 对象无法在新线程中实例化,同时可用于主线程(某种程度上)。

Dispatcher.BeginInvoke 似乎是我的救世主,但到目前为止我还无法弄清楚什么应该进入 Querier 类以及什么应该进入 ProgressBarWindow类。如何让这两个线程与 ProgressBarWindow 的同一个实例交互?

请询问您是否需要更多详细信息,我会尽力澄清。

最佳答案

您可以使用 Progress 类用长时间运行的操作的当前进度更新 UI。

首先在您的 UI 中创建一个 Progress 实例:

Progress<int> progress = new Progress<int>(currentProgress =>
{
progressBar.Value = currentProgress;
//todo do other stuff
});

然后将其传递给长时间运行的进程:

public List<Item> getItems(IProgress<int> progress)
{
progress.Report(0);
//todo do something
progress.Report(100);
}

关于c# - 从主线程调用 WPF 窗口中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20619543/

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