【问题标题】:Show a message in GUI while a thread is running in C#在 C# 中运行线程时在 GUI 中显示消息
【发布时间】:2012-05-11 19:42:44
【问题描述】:

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

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

我正在考虑在一个单独的线程中运行更新,以便在更新处理时可以使用 GUI 的其余部分。

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

我已经四处寻找方法来做到这一点,但似乎没有作为我正在寻找的解决方案弹出。有谁知道这是否可能以及如何做到这一点?

【问题讨论】:

  • 向我们展示代码,以便我们在其上构建!!否则你会得到超级通用的答案;)

标签: c# .net multithreading .net-4.0


【解决方案1】:

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

假设下面的方法是在你的 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);
}

【讨论】:

  • 是的,现在的 GUI 必须是 WPF。
【解决方案2】:

和这个小家伙:

internal static class ControlExtensions
{
    internal static void Invoke(this Control control, Action action)
    {
        control.Invoke(action);
    }
 }

你可以调用你的代码(在win form world中,wpf有自己的解决方案):

... form.Invoke(()=>form.SomeControl.SomeProperty=someValue);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多