Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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# 没有用户交互的WPF后台处理?_C#_Wpf_Wpf 4.0 - Fatal编程技术网

C# 没有用户交互的WPF后台处理?

C# 没有用户交互的WPF后台处理?,c#,wpf,wpf-4.0,C#,Wpf,Wpf 4.0,我正在制作一个小程序,它将主要呈现来自不同来源的信息,我需要在后台进行一个持续的循环来完成这项艰巨的工作。但是我不能按任何按钮来获取这些信息,它需要自己运行 我对WPF的整个概念还不熟悉,尽管整个XAML部分让我感觉很整洁,但我仍在尝试适应这样的想法,即整个概念感觉非常受事件驱动 我已经研究过System.ComponentModel.BackgroundWorker类,但它感觉不对,因为它是由DoWOrk和WorkComplete定义的,而这永远不会是WorkComplete 执行后台处理、避

我正在制作一个小程序,它将主要呈现来自不同来源的信息,我需要在后台进行一个持续的循环来完成这项艰巨的工作。但是我不能按任何按钮来获取这些信息,它需要自己运行

我对WPF的整个概念还不熟悉,尽管整个XAML部分让我感觉很整洁,但我仍在尝试适应这样的想法,即整个概念感觉非常受事件驱动

我已经研究过System.ComponentModel.BackgroundWorker类,但它感觉不对,因为它是由DoWOrk和WorkComplete定义的,而这永远不会是WorkComplete


执行后台处理、避免用户交互的正确方法是什么?

我建议使用
System.Threading.Timer
。下面是一些示例代码隐藏类,它将每秒用当前时间更新一个名为
timeLabel
的标签:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.Loaded += MainWindow_Loaded;
    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        Timer timer = new Timer(TimerElapsedHandler, null, 0, 1000);
    }

    private void TimerElapsedHandler(object state)
    {
        this.Dispatcher.Invoke(() => { timeLabel.Content = DateTime.Now.ToLongTimeString(); });
    }
}
您还可以使用某种BackgroundWorker/Task/Anything,让它在单独的线程中执行以下内容:

while (...)
{
    this.Dispatcher.Invoke(() => { timeLabel.Content = DateTime.Now.ToLongTimeString(); });
    Thread.Sleep(1000);
}

BackgroundWorker还有一个ReportProgress
使用userState作为对象传回信息
它是一个对象,因此您可以传递任何需要传递的内容


您可以使用
System.Timers.Timer
以防您要以固定的时间间隔调用某个代理。