首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF中的背景工作类

WPF中的背景工作类
EN

Stack Overflow用户
提问于 2012-04-09 09:18:01
回答 2查看 3.2K关注 0票数 0

我正在WPF学习背景工人班。下面的代码在文件MainWindow.xaml.cs中

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.ComponentModel;

namespace FrontEnd
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private BackgroundWorker backGroundWorker;

        public MainWindow()
        {
            InitializeComponent();
            backGroundWorker = ((BackgroundWorker)this.FindResource("backgroundWorker"));
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {

            button1.IsEnabled = false;
            Flow pro = new Flow(20,10);
            backGroundWorker.RunWorkerAsync(pro);
        }

        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            Flow pro = (Flow)e.Argument;
           e.Result = pro.NaturalNumbers();
        }

        private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value= e.ProgressPercentage;
        }

        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if ((int)e.Result == 1) MessageBox.Show("DONE");
            progressBar1.Value = 0;
        }
    }
}

下面的代码在文件Flow.cs中

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace FrontEnd
{
    class Flow
    {
        long i;
        //private int x,y;
        public int X
        {
            get; set;
        }
        public int Y
        {
            get; set;
        }

        public Flow(int x, int y)
        {
            X = x;
            Y = y;
        }
        public int NaturalNumbers()
        {
            for (i = 0; i < 9999; i++)
            {
                Console.WriteLine(i);
                long iteration = i * 100 / 9999;
                if ((i % iteration == 0) &&
                (backgroundWorker != null) && backgroundWorker.WorkerReportsProgress)
                {
                    backgroundWorker.ReportProgress(iteration);
                }
            }
            return 1;
        }
    }
}

错误:名称'backgroundWorker‘在当前上下文中不存在

我怎样才能使进度条工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-09 09:39:01

下面是一个简单的例子:

代码语言:javascript
复制
public partial class BackgroundWorkerPage : Page
{
    private readonly BackgroundWorker _worker = new BackgroundWorker();

    public BackgroundWorkerPage()
    {
        InitializeComponent();

        _worker.DoWork += WorkerOnDoWork;
        _worker.WorkerReportsProgress = true;
        _worker.ProgressChanged += WorkerOnProgressChanged;
    }

    private void WorkerOnProgressChanged(object sender, ProgressChangedEventArgs progressChangedEventArgs)
    {
        progressBar.Value = progressChangedEventArgs.ProgressPercentage;
    }

    private void WorkerOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
    {
        for (int i = 0; i <= 100; i++)
        {
            Thread.Sleep(50);
            _worker.ReportProgress(i);
        }
    }

    private void Button_Click_1(object sender, System.Windows.RoutedEventArgs e)
    {
        _worker.RunWorkerAsync();
    }
}

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <ProgressBar x:Name="progressBar" Height="23" Minimum="0" Maximum="100"/>
    <Button Grid.Row="1" Height="23" Content="Start" Click="Button_Click_1"/>
</Grid>

你需要稍微修改你的代码

代码语言:javascript
复制
private void WorkerOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
{
    var flow = new Flow(_worker);
    flow.NaturalNumbers();
}

internal class Flow
{
    private readonly BackgroundWorker _worker;

    public Flow(int x, int y)
    {
        X = x;
        Y = y;
    }

    public Flow(BackgroundWorker worker)
    {
        _worker = worker;
    }

    public int X { get; set; }
    public int Y { get; set; }

    public int NaturalNumbers()
    {
        for (int i = 0; i <= 9999; i++)
        {
            int iteration = i*100/9999;

            // your if(...) fails with divide by zero exception

            _worker.ReportProgress(iteration);
        }

        return 1;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-11-28 09:29:46

Introduction

每当我们尝试在UI上执行一些不冻结它的长时间运行操作时,我们需要在一个单独的thread.In中运行它--本文将研究BackgroundWorker类,作为解决这个问题的各种解决方案之一,并给出一个简单的示例。BackgroundWorker在单独的线程上执行操作,并在必要时向UI提供通知。直接实验

让我们按照下面的方式创建一个UI

目标是,当我们点击“填充”按钮时,同时我们应该能够在"Textbox“中写一些东西。

现在让我们看看没有BackgroundWorker的代码

代码语言:javascript
复制
public partial class WithOutBackgroundThread : Form
{  
    List<Employee> lstEmp;

    public WithOutBackgroundThread()
    {
        InitializeComponent();
        lstEmp = new List<Employee>();
    }

    private void btnPopulate_Click(object sender, EventArgs e)
    {  
        GetEmployeeRecords();
        dataGridView1.DataSource = lstEmp;
        lblStatus.Text = "Work Completed";
    }

    //Prepare the data
    private void GetEmployeeRecords()
    {
        for (int i = 1; i <= 10; i++)
        {
            // Simulate a pause
            Thread.Sleep(1000);
            lstEmp.Add(new Employee { EmpId = i, EmpName = "Name" + i });
        }
    }
}

代码是相当straightforward.In的"GetEmployeeRecords()“方法,我们正在准备data.We已经引入了"Thread.Sleep(1000)”来延迟。在“填充”按钮单击事件中,我们将填充Gird。

但是如果我们执行这段代码,UI将变得没有响应性,从此,我们就不能在"Textbox“上执行任何任务,这是我们的目标。

从今以后,让我们将代码更改为

代码语言:javascript
复制
public partial class WithBackgroundThread : Form
{
    BackgroundWorker workerThread;
    List<Employee> lstEmp;

    public WithBackgroundThread()
    {
        InitializeComponent();

        lstEmp = new List<Employee>();
        workerThread = new BackgroundWorker();
        workerThread.DoWork += new DoWorkEventHandler(workerThread_DoWork);
        workerThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(workerThread_RunWorkerCompleted);

    }

    private void btnPopulate_Click(object sender, EventArgs e)
    {
        workerThread.RunWorkerAsync(); 
    }

    private void workerThread_DoWork(object sender, DoWorkEventArgs e)
    {
        GetEmployeeRecords();
    }

    private void workerThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        lblStatus.Text = "Work Completed";
        dataGridView1.DataSource = lstEmp;
    }

    //Prepare the data
    private void GetEmployeeRecords()
    {
        for (int i = 1; i <= 10; i++)
        {
            // Simulate a pause
            Thread.Sleep(1000);
            lstEmp.Add(new Employee { EmpId = i, EmpName = "Name" + i });
        }
    }
}

许多新的things.We将一个接一个地探索。

首先,我们需要声明BackgroundWorker线程

代码语言:javascript
复制
BackgroundWorker workerThread = new BackgroundWorker();

接下来,我们需要订阅这些事件。

代码语言:javascript
复制
workerThread.DoWork += new DoWorkEventHandler(workerThread_DoWork);
workerThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(workerThread_RunWorkerCompleted);

作为第三步,我们需要实现这两种方法。

代码语言:javascript
复制
private void workerThread_DoWork(object sender, DoWorkEventArgs e)
{
   // run all background tasks here
   GetEmployeeRecords();
}

private void workerThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  //update ui once worker complete its work
  lblStatus.Text = "Work Completed";
  dataGridView1.DataSource = lstEmp;
}

当我们调用"DoWork“方法时,会引发"RunWorkerAsync”事件。这是在后台操作完成、取消或引发异常时启动执行可能耗时的work.The "RunWorkerCompleted“事件的操作的地方。

最后一步,从“填充”按钮单击事件调用"RunWorkerAsync“。

代码语言:javascript
复制
private void btnPopulate_Click(object sender, EventArgs e)
{
    workerThread.RunWorkerAsync(); 
}

"RunWorkerAsync“开始执行后台操作。

现在,如果我们运行我们的应用程序,我们将能够填充网格,并在"Textbox“上写一些东西。

谢谢

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10071223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档