c# - 在 C# 中运行线程时在 GUI 中显示消息

标签 c# .net multithreading .net-4.0

我有一个应用程序,它在第一次启动时每 7 天执行一次更新,从 Web 下载一些文件。

此更新最多可能需要 5 分钟,具体取决于需要下载的文件数量。

我想做的是在单独的线程中运行更新,以便在处理更新时可以使用 GUI 的其余部分。

这对我的应用程序来说似乎是一个非常可行的选择,但我还想在主 GUI 中显示一条消息,可能在状态栏中,告诉用户更新正在处理并在完成后消失。

我已经四处寻找执行此操作的方法,但似乎没有找到我正在寻找的解决方案。有谁知道这是否可能以及如何做?

最佳答案

您需要做的就是用 Dispatcher.Invoke 包装您的 UI 访问代码从后台线程调用。要使用的 Dispatcher 实例可以通过 Dispatcher 获得UIElement 的属性。

假设以下方法是在您的 UI 元素的类定义中定义的:

private void ProcessItems(IList<Item> items)
{
    Task.Factory.StartNew(() =>
    {
        for (int i = 0; i < items.Count; ++i)
        {
            // Code here runs on background thread.
            this.ProcessItem(items[i]);

            this.Dispatcher.Invoke(DispatcherPriority.Normal, () =>
            {
                // Code here runs on UI thread.
                this.UpdateStatus("Completed " + (i + 1) + " of " + items.Count);
            });
        }
    },
        TaskCreationOptions.LongRunning);
}

关于c# - 在 C# 中运行线程时在 GUI 中显示消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10557610/

相关文章:

java - 如何在实现可运行的两个子类之间共享一个变量

C# 异步套接字问题

c# - 字典中的 “An item with the same key has already been added”

c# - 使用 TransformOnBuild 时无法引用 T4 模板中的依赖项程序集

c# - 我可以使用 C# 方法(带参数)的结果作为另一个方法的默认参数吗?

c# - 琐碎的属性曾经拯救过你的培根吗?

.net - 哪些因素会影响我在新项目中使用的数据访问层?

c# - Entity Framework 、DBContext 和 using() + 异步?

c# - 在已发布的 VS2010 C# 项目中包含数据库的独立副本

c - 在 gui 之外的另一个线程中运行函数