Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当线程在C中运行时,在GUI中显示消息#_C#_.net_Multithreading_.net 4.0 - Fatal编程技术网

C# 当线程在C中运行时,在GUI中显示消息#

C# 当线程在C中运行时,在GUI中显示消息#,c#,.net,multithreading,.net-4.0,C#,.net,Multithreading,.net 4.0,我有一个应用程序,在第一次启动时,每7天执行一次更新,从web下载一些文件 根据需要下载的文件数量,此更新最多可能需要5分钟 我想做的是在一个单独的线程中运行更新,以便在处理更新时GUI的其余部分可用 对于我的应用程序来说,这似乎是一个非常可行的选项,但我也希望在主GUI中(可能在状态栏中)显示一条消息,告诉用户更新正在处理中,并且在完成时会消失 我已经到处寻找方法来做这件事,但似乎没有什么弹出的解决方案,我正在寻找。有人知道这是否可能以及如何做到吗 您需要做的就是用后台线程的调用包装您的UI访

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

根据需要下载的文件数量,此更新最多可能需要5分钟

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

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


我已经到处寻找方法来做这件事,但似乎没有什么弹出的解决方案,我正在寻找。有人知道这是否可能以及如何做到吗

您需要做的就是用后台线程的调用包装您的UI访问代码。要使用的
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);
}
private void ProcessItems(IList项)
{
Task.Factory.StartNew(()=>
{
对于(int i=0;i
{
//这里的代码在UI线程上运行。
this.UpdateStatus(“已完成”+(i+1)+“of”+items.Count);
});
}
},
TaskCreationOptions.LongRunning);
}
和这个小家伙在一起:

internal static class ControlExtensions
{
    internal static void Invoke(this Control control, Action action)
    {
        control.Invoke(action);
    }
 }
您可以调用代码(在win form world中,wpf有自己的解决方案):


使用。向我们展示代码,以便我们可以在此基础上构建!!否则,您将得到超级通用的答案;)是的,现在的GUI必须是WPF。
... form.Invoke(()=>form.SomeControl.SomeProperty=someValue);