C# BackgroundWorker 详解

By admin in 4858.com on 2019年4月8日

在C#先后中,日常会有1对耗费时间较长的CPU密集型运算,假若平素在
UI
线程执行那样的演算就会现出UI不响应的难题。消除那类难题的要紧路径是利用二十八线程,运行四个后台线程,把运算操作放在那个后台线程中形成。但是原生接口的线程操作有一对难度,假若要更进一步的去实现线程间的通讯就会难上加难。

C# BackgroundWorker 详解

 

在C#程序中,日常会有1部分耗费时间较长的CPU密集型运算,倘使直接在 UI
线程执行那样的演算就会出现UI不响应的标题。消除那类难题的重中之重路径是利用拾贰线程,运维叁个后台线程,把运算操作放在这么些后台线程中达成。可是原生接口的线程操作有壹部分难度,若是要更进一步的去完毕线程间的通讯就会难上加难。

幸好 .NET 类库中提供了2个叫作 BackgroundWorker
的类能够相比优雅的缓解那类难点。尽管BackgroundWorker
类使用起来对比简单,但里面依旧有1对索要留意的底细,上边大家就经过 demo
程序介绍它的严重性用法。我们在
demo中总括一到拾0的丰裕和,为了演示,每一遍总计都 sleep 600纳秒,demo
的UI为:

4858.com 1

在C#先后中,日常会有壹些耗费时间较长的CPU密集型运算,假使直接在
UI
线程执行那样的演算就会出现UI不响应的标题。消除那类难点的重点途径是应用八线程,运行3个后台线程,把运算操作放在这几个后台线程中形成。不过原生接口的线程操作有部分难度,要是要更进一步的去做到线程间的通讯就会难上加难。

C# BackgroundWorker 详解,

在C#先后中,平日会有一些耗费时间较长的CPU密集型运算,如若直接在 UI
线程执行那样的运算就会现出UI不响应的标题。化解这类难点的机要路径是利用四线程,运行叁个后台线程,把运算操作放在这几个后台线程中完成。可是原生接口的线程操作有部分难度,即使要更进一步的去完毕线程间的通讯就会难上加难。

辛亏 .NET 类库中提供了一个名字为 BackgroundWorker
的类能够比较优雅的解决那类难点。尽管BackgroundWorker
类使用起来相比较简单,但中间依旧有局地索要专注的细节,上边大家就通过 demo
程序介绍它的要害用法。大家在
demo中总结一到100的拉长和,为了演示,每一次计算都 sleep 600微秒,demo
的UI为:

4858.com 2

幸亏 .NET
类库中提供了二个称作 BackgroundWorker
的类可以相比优雅的化解这类难题。即使BackgroundWorker
类使用起来相比较不难,但内部依然有部分急需留意的底细,上边我们就透过 demo
程序介绍它的显要用法。大家在
demo中总计1到100的增加和,为了演示,每便总计都 sleep 600皮秒,demo
的UI为:

用法概述

在窗体上营造2个BackgroundWorker 实例,在它的
DoWork事件处理函数中添加耗费时间的演算,然后调用它的RunWorkerAsync方法就足以了。

4858.com 3

private BackgroundWorker _demoBGWorker = new BackgroundWorker();
_demoBGWorker.DoWork += BGWorker_DoWork;
_demoBGWorker.RunWorkerAsync();
private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
{
    //在这里执行耗时的运算。
    int sum = 0;
    for (int i = 0; i <= 100; i++)
    {
        sum += i;
    }
}

4858.com 4

是或不是有点太简单了?那么让大家思索上面包车型地铁题材:

假若我们想要把参数字传送递给运算进度该怎么办?
在运算进程中大家愿意把实时的音讯体未来UI上该如何做?
壹旦大家想要撤废正在拓展的演算该如何做?
只要运算进度出现万分大家又该怎么处理?

接下去大家就二个二个的拍卖这几个题材。

万幸 .NET
类库中提供了2个称为 BackgroundWorker
的类能够相比较优雅的消除那类难题。就算BackgroundWorker
类使用起来比较不难,但里面依然有1对亟待留意的底细,上面大家就经过 demo
程序介绍它的首要性用法。大家在
demo中计算1到十0的丰裕和,为了演示,每一回总结都 sleep 600飞秒,demo
的UI为:

用法概述

在窗体上创设1个BackgroundWorker 实例,在它的
DoWork事件处理函数中添加耗费时间的运算,然后调用它的RunWorkerAsync方法就足以了。

private BackgroundWorker _demoBGWorker = new BackgroundWorker();
_demoBGWorker.DoWork += BGWorker_DoWork;
_demoBGWorker.RunWorkerAsync();
private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
{
    //在这里执行耗时的运算。
    int sum = 0;
    for (int i = 0; i <= 100; i++)
    {
        sum += i;
    }
}

是还是不是有点太简单了?那么让我们着想上面的题材:

若果大家想要把参数字传送递给运算进程该如何是好?
在运算进程中我们盼望把实时的新闻映以后UI上该怎么做?
假使我们想要裁撤正在拓展的演算该如何是好?
C# BackgroundWorker 详解。假如运算进度现身十分我们又该怎么处理?

接下去我们就一个一个的处理那么些难点。

4858.com 5

把参数字传送递给运算进度

直白把十0写死到运算进度中可倒霉,大家还打算允许用户内定求和的范围吗!所以须求把十0作为参数字传送递给计算进程。在概述中大家由此调用RunWorkerAsync方法运营总结进程,其实那么些法子能够承受一个object 类型的参数。通过它大家就可以把此外数据传递给总结进程:

4858.com 6

//别忘了设置滚动条。
this.progressBarSum.Maximum = 100;
_demoBGWorker.RunWorkerAsync(100);
//下面是更新后的 BGWorker_DoWork 方法:
private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
{
    //在这里执行耗时的运算。
    int endNumber = 0;
    if(e.Argument != null)
    {
        endNumber = (int)e.Argument;
    }
    int sum = 0;
    for (int i = 0; i <= endNumber; i++)
    {
        sum += i;
    }
}

4858.com 7

BGWorker_DoWork事件处理函数通过参数 e
的Argument属性传来了我们希望的运算音信。

4858.com 8

把参数字传送递给运算进度

平素把拾0写死到运算进程中可不好,我们还打算允许用户钦点求和的界定吗!所以须要把100看作参数字传送递给总结进度。在概述中大家因而调用RunWorkerAsync方法运转计算进程,其实这一个措施能够承受3个object 类型的参数。通过它大家就可以把此外数据传递给计算进程:

//别忘了设置滚动条。
this.progressBarSum.Maximum = 100;
_demoBGWorker.RunWorkerAsync(100);
//下面是更新后的 BGWorker_DoWork 方法:
private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
{
    //在这里执行耗时的运算。
    int endNumber = 0;
    if(e.Argument != null)
    {
        endNumber = (int)e.Argument;
    }
    int sum = 0;
    for (int i = 0; i <= endNumber; i++)
    {
        sum += i;
    }
}

BGWorker_DoWork事件处理函数通过参数 e
的Argument属性传来了笔者们期望的运算消息。

用法概述

在窗体上营造3个BackgroundWorker
实例,在它的
DoWork事件处理函数中添加耗费时间的运算,然后调用它的RunWorkerAsync方法就足以了。

private BackgroundWorker _demoBGWorker = new BackgroundWorker();
_demoBGWorker.DoWork += BGWorker_DoWork;
_demoBGWorker.RunWorkerAsync();
private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
{
    //在这里执行耗时的运算。
    int sum = 0;
    for (int i = 0; i <= 100; i++)
    {
        sum += i;
    }
}

是还是不是有点太简单了?那么让大家着想上面包车型客车难题:

只要我们想要把参数字传送递给运算进程该如何是好?
在运算进度中大家期待把实时的新闻呈现在UI上该怎么做?
假定大家想要撤消正在展开的运算该怎么办?
如果运算进度出现非凡大家又该怎么样处理?

接下去大家就2个二个的拍卖那么些难题。

把新闻传递给UI

由于总计进度比较长,大家在经过进程条来展现当前速度的同时,还愿意能实时的把计算的高级中学级结果展现在UI上。当然,BackgroundWorker对这么些用例也提供了很好的支撑。它同意大家在推行总括的进程中给UI线程发送信息,下边看看实际的做法:

_demoBGWorker.WorkerReportsProgress = true;
_demoBGWorker.ProgressChanged += BGWorker_ProgressChanged;

第一要把WorkerReportsProgress 属性设置为 true,然后为ProgressChanged
事件添加处理方法:

4858.com 9

private void BGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //修改进度条的显示。
    this.progressBarSum.Value = e.ProgressPercentage;

    //如果有更多的信息需要传递,可以使用 e.UserState 传递一个自定义的类型。
    //这是一个 object 类型的对象,您可以通过它传递任何类型。
    //我们仅把当前 sum 的值通过 e.UserState 传回,并通过显示在窗口上。
    string message = e.UserState.ToString();
    this.labelSum.Text = message;
}

4858.com 10

后续立异 BGWorker_DoWork方法:

4858.com 11

private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker bgWorker = sender as BackgroundWorker;
    int endNumber = 0;
    if(e.Argument != null)
    {
        endNumber = (int)e.Argument;
    }

    int sum = 0;
    for (int i = 0; i <= endNumber; i++)
    {
        sum += i;

        string message = "Current sum is: " + sum.ToString();
        //ReportProgress 方法把信息传递给 ProcessChanged 事件处理函数。
        //第一个参数类型为 int,表示执行进度。
        //如果有更多的信息需要传递,可以使用 ReportProgress 的第二个参数。
        //这里我们给第二个参数传进去一条消息。
        bgWorker.ReportProgress(i, message);
        Thread.Sleep(600);
    }
}

4858.com 12

OK,将来曾经能够见见进程条和实践消息的翻新了。

用法概述

在窗体上创设叁个BackgroundWorker
实例,在它的
DoWork事件处理函数中添加耗费时间的演算,然后调用它的RunWorkerAsync方法就能够了。

private BackgroundWorker _demoBGWorker = new BackgroundWorker();
_demoBGWorker.DoWork += BGWorker_DoWork;
_demoBGWorker.RunWorkerAsync();
private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
{
    //在这里执行耗时的运算。
    int sum = 0;
    for (int i = 0; i <= 100; i++)
    {
        sum += i;
    }
}

是否有点太简单了?那么让大家着想上面包车型大巴题目:

若是大家想要把参数字传送递给运算进程该如何做?
在运算进程中大家期望把实时的新闻展现在UI上该如何是好?
若是大家想要撤销正在进行的运算该怎么做?
比方运算进程出现非常大家又该怎样处理?

接下去我们就二个三个的拍卖那么些题材。

把音信传递给UI

鉴于总结进程相比较长,大家在通过进程条来突显当前速度的还要,还期待能实时的把计算的中间结果突显在UI上。当然,BackgroundWorker对这么些用例也提供了很好的支撑。它同意大家在实行计算的历程中给UI线程发送新闻,下边看看现实的做法:

_demoBGWorker.WorkerReportsProgress = true;
_demoBGWorker.ProgressChanged += BGWorker_ProgressChanged;

首先要把WorkerReportsProgress 属性设置为 true,然后为ProgressChanged
事件添加处理办法:

private void BGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //修改进度条的显示。
    this.progressBarSum.Value = e.ProgressPercentage;

    //如果有更多的信息需要传递,可以使用 e.UserState 传递一个自定义的类型。
    //这是一个 object 类型的对象,您可以通过它传递任何类型。
    //我们仅把当前 sum 的值通过 e.UserState 传回,并通过显示在窗口上。
    string message = e.UserState.ToString();
    this.labelSum.Text = message;
}

继承立异 BGWorker_DoWork方法:

private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker bgWorker = sender as BackgroundWorker;
    int endNumber = 0;
    if(e.Argument != null)
    {
        endNumber = (int)e.Argument;
    }

    int sum = 0;
    for (int i = 0; i <= endNumber; i++)
    {
        sum += i;

        string message = "Current sum is: " + sum.ToString();
        //ReportProgress 方法把信息传递给 ProcessChanged 事件处理函数。
        //第一个参数类型为 int,表示执行进度。
        //如果有更多的信息需要传递,可以使用 ReportProgress 的第二个参数。
        //这里我们给第二个参数传进去一条消息。
        bgWorker.ReportProgress(i, message);
        Thread.Sleep(600);
    }
}

OK,未来一度能够看到进程条和执行音信的换代了。

把参数字传送递给运算进程

平昔把100写死到运算进程中可不好,大家还打算允许用户钦赐求和的界定吗!所以须要把拾0看作参数字传送递给计算进度。在概述中咱们经过调用RunWorkerAsync方法运维总结进程,其实那么些办法还行二个object 类型的参数。通过它大家就足以把任何数据传递给总结进程:

//别忘了设置滚动条。
this.progressBarSum.Maximum = 100;
_demoBGWorker.RunWorkerAsync(100);
//下面是更新后的 BGWorker_DoWork 方法:
private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
{
    //在这里执行耗时的运算。
    int endNumber = 0;
    if(e.Argument != null)
    {
        endNumber = (int)e.Argument;
    }
    int sum = 0;
    for (int i = 0; i <= endNumber; i++)
    {
        sum += i;
    }
}

BGWorker_DoWork事件处理函数通过参数
e 的Argument属性传来了大家盼望的演算音讯。

撤回操作

在实践进度中允许用户撤除当前的操作是2个中坚的陈设,BackgroundWorker自然有很好的支撑:

_demoBGWorker.WorkerSupportsCancellation = true;

和WorkerReportsProgress属性1样,假使要支持撤消操作大家须要安装
WorkerSupportsCancellation属性为
true。并且还要在BGWorker_DoWork方法中展开销撑,在 for 循环中
Thread.Sleep(600)前边添加代码:

4858.com 13

bgWorker.ReportProgress(i, message);
Thread.Sleep(600);

//在操作的过程中需要检查用户是否取消了当前的操作。
if (bgWorker.CancellationPending == true)
{
    e.Cancel = true;
    break;
}

4858.com 14

假使检验到用户点击的打消按钮,就退出当前的臆度进程。上边是点击撤销按钮时要调用的代码:

_demoBGWorker.CancelAsync();

明日已经能够支撑撤销操作了,火速试试吧!

把参数字传送递给运算进度

一贯把十0写死到运算进程中可倒霉,咱们还打算允许用户钦命求和的界定吗!所以供给把100当作参数字传送递给总计进度。在概述中大家透过调用RunWorkerAsync方法运转总括进度,其实那几个方法还行多少个object 类型的参数。通过它我们就足以把别的数据传递给总计进程:

//别忘了设置滚动条。
this.progressBarSum.Maximum = 100;
_demoBGWorker.RunWorkerAsync(100);
//下面是更新后的 BGWorker_DoWork 方法:
private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
{
    //在这里执行耗时的运算。
    int endNumber = 0;
    if(e.Argument != null)
    {
        endNumber = (int)e.Argument;
    }
    int sum = 0;
    for (int i = 0; i <= endNumber; i++)
    {
        sum += i;
    }
}

BGWorker_DoWork事件处理函数通过参数
e 的Argument属性传来了笔者们意在的演算音信。

裁撤操作

在执行进度中允许用户撤消当前的操作是二个中坚的设计,BackgroundWorker自然有很好的支撑:

_demoBGWorker.WorkerSupportsCancellation = true;

和WorkerReportsProgress属性一样,要是要补助撤销操作大家必要设置
WorkerSupportsCancellation属性为
true。并且还要在BGWorker_DoWork方法中开展支撑,在 for 循环中
Thread.Sleep(600)前边添加代码:

bgWorker.ReportProgress(i, message);
Thread.Sleep(600);

//在操作的过程中需要检查用户是否取消了当前的操作。
if (bgWorker.CancellationPending == true)
{
    e.Cancel = true;
    break;
}

要是检验到用户点击的裁撤按钮,就淡出当前的一个钱打二十五个结进程。上边是点击裁撤按钮时要调用的代码:

_demoBGWorker.CancelAsync();

明日已经可以帮忙废除操作了,赶快试试啊!

把消息传递给UI

是因为总结进程相比较长,我们在通过进程条来展现当前进程的还要,还愿意能实时的把总计的中间结果呈现在UI上。当然,BackgroundWorker对这一个用例也提供了很好的扶助。它同意大家在推行总计的历程中给UI线程发送音讯,上边看看实际的做法:

_demoBGWorker.WorkerReportsProgress = true;
_demoBGWorker.ProgressChanged += BGWorker_ProgressChanged;

第二要把WorkerReportsProgress
属性设置为 true,然后为ProgressChanged 事件添加处理方法:

private void BGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //修改进度条的显示。
    this.progressBarSum.Value = e.ProgressPercentage;

    //如果有更多的信息需要传递,可以使用 e.UserState 传递一个自定义的类型。
    //这是一个 object 类型的对象,您可以通过它传递任何类型。
    //我们仅把当前 sum 的值通过 e.UserState 传回,并通过显示在窗口上。
    string message = e.UserState.ToString();
    this.labelSum.Text = message;
}

后续创新BGWorker_DoWork方法:

private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker bgWorker = sender as BackgroundWorker;
    int endNumber = 0;
    if(e.Argument != null)
    {
        endNumber = (int)e.Argument;
    }

    int sum = 0;
    for (int i = 0; i <= endNumber; i++)
    {
        sum += i;

        string message = "Current sum is: " + sum.ToString();
        //ReportProgress 方法把信息传递给 ProcessChanged 事件处理函数。
        //第一个参数类型为 int,表示执行进度。
        //如果有更多的信息需要传递,可以使用 ReportProgress 的第二个参数。
        //这里我们给第二个参数传进去一条消息。
        bgWorker.ReportProgress(i, message);
        Thread.Sleep(600);
    }
}

OK,未来已经足以观望进程条和进行消息的换代了。

可怜处理

若是在测算过程中产生了非常该怎么处理?有未有法子知道计算进程已经完毕?当然要有,即正是符合规律的利落也须求得到计算的结果。

4858.com 15

_demoBGWorker.RunWorkerCompleted += BGWorker_RunWorkerCompleted;
private void BGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //如果用户取消了当前操作就关闭窗口。
    if (e.Cancelled)
    {
        this.Close();
    }

    //计算已经结束,需要禁用取消按钮。
    this.btnCancel.Enabled = false;

    //计算过程中的异常会被抓住,在这里可以进行处理。
    if (e.Error != null)
    {
        Type errorType = e.Error.GetType();
        switch (errorType.Name)
        {
            case "ArgumentNullException":
            case "MyException":
                //do something.
                break;
            default:
                //do something.
                break;
        }
    }

    //计算结果信息:e.Result
    //use it do something.
}

4858.com 16

RunWorkerCompleted 事件处理函数会在DoWork
事件处理函数重临后被调用。通过它大家能够展开部分运算截止后的操作,比如禁用裁撤按钮,极度处理,结果突显等。
只顾,尽管想要获得 e.Result,您须要在BGWorker_DoWork方法中设置
e.Result属性,如:

e.Result = sum;

 

小结,BackgroundWorker
类功用完善且使用方便,实在是拍卖异步耗费时间操作的利器!

作者:sparkdev

出处:

把音信传递给UI

由于计算进程相比较长,我们在经过进程条来显示当前速度的同时,还指望能实时的把计算的中游结果突显在UI上。当然,BackgroundWorker对这些用例也提供了很好的协助。它同意大家在实践总结的进程中给UI线程发送音讯,上面看看实际的做法:

_demoBGWorker.WorkerReportsProgress = true;
_demoBGWorker.ProgressChanged += BGWorker_ProgressChanged;

第二要把WorkerReportsProgress
属性设置为 true,然后为ProgressChanged 事件添加处理方法:

private void BGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //修改进度条的显示。
    this.progressBarSum.Value = e.ProgressPercentage;

    //如果有更多的信息需要传递,可以使用 e.UserState 传递一个自定义的类型。
    //这是一个 object 类型的对象,您可以通过它传递任何类型。
    //我们仅把当前 sum 的值通过 e.UserState 传回,并通过显示在窗口上。
    string message = e.UserState.ToString();
    this.labelSum.Text = message;
}

4858.com ,接二连三革新BGWorker_DoWork方法:

private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker bgWorker = sender as BackgroundWorker;
    int endNumber = 0;
    if(e.Argument != null)
    {
        endNumber = (int)e.Argument;
    }

    int sum = 0;
    for (int i = 0; i <= endNumber; i++)
    {
        sum += i;

        string message = "Current sum is: " + sum.ToString();
        //ReportProgress 方法把信息传递给 ProcessChanged 事件处理函数。
        //第一个参数类型为 int,表示执行进度。
        //如果有更多的信息需要传递,可以使用 ReportProgress 的第二个参数。
        //这里我们给第二个参数传进去一条消息。
        bgWorker.ReportProgress(i, message);
        Thread.Sleep(600);
    }
}

OK,现在早就能够看到进程条和执行音信的换代了。

至极处理

就算在总结进度中发生了老大该怎么处理?有未有主意知道计算进程已经终结?当然要有,即正是常规的截至也亟需获得总计的结果。

_demoBGWorker.RunWorkerCompleted += BGWorker_RunWorkerCompleted;
private void BGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //如果用户取消了当前操作就关闭窗口。
    if (e.Cancelled)
    {
        this.Close();
    }

    //计算已经结束,需要禁用取消按钮。
    this.btnCancel.Enabled = false;

    //计算过程中的异常会被抓住,在这里可以进行处理。
    if (e.Error != null)
    {
        Type errorType = e.Error.GetType();
        switch (errorType.Name)
        {
            case "ArgumentNullException":
            case "MyException":
                //do something.
                break;
            default:
                //do something.
                break;
        }
    }

    //计算结果信息:e.Result
    //use it do something.
}

RunWorkerCompleted 事件处理函数会在DoWork
事件处理函数重临后被调用。通过它大家能够展开局地运算截止后的操作,比如禁用撤废按钮,非常处理,结果彰显等。
小心,倘若想要拿到 e.Result,您需求在BGWorker_DoWork方法中装置
e.Result属性,如:

e.Result = sum;

 

小结,BackgroundWorker
类效能完善且使用简便,实在是拍卖异步耗费时间操作的利器!

BackgroundWorker 详解,
在C#先后中,平常会有局地耗费时间较长的CPU密集型运算,假诺一向在 UI
线程执行那样的运算就会并发UI不响应的难题。…

撤废操作

在实践过程中允许用户撤销当前的操作是贰个宗旨的统一筹划,BackgroundWorker自然有很好的支撑:

_demoBGWorker.WorkerSupportsCancellation = true;

和WorkerReportsProgress属性1样,假如要接济打消操作大家须求设置
WorkerSupportsCancellation属性为
true。并且还要在BGWorker_DoWork方法中举办支撑,在 for 循环中
Thread.Sleep(600)前边添加代码:

bgWorker.ReportProgress(i, message);
Thread.Sleep(600);

//在操作的过程中需要检查用户是否取消了当前的操作。
if (bgWorker.CancellationPending == true)
{
    e.Cancel = true;
    break;
}

假定检查评定到用户点击的吊销按钮,就退出当前的计量进程。上面是点击打消按钮时要调用的代码:

_demoBGWorker.CancelAsync();

现在早就能够帮助裁撤操作了,快捷试试啊!

撤回操作

在实践进度中允许用户撤除当前的操作是三个基本的安插性,BackgroundWorker自然有很好的支撑:

_demoBGWorker.WorkerSupportsCancellation = true;

和WorkerReportsProgress属性一样,要是要帮忙打消操作大家须求设置
WorkerSupportsCancellation属性为
true。并且还要在BGWorker_DoWork方法中进行支撑,在 for 循环中
Thread.Sleep(600)后边添加代码:

bgWorker.ReportProgress(i, message);
Thread.Sleep(600);

//在操作的过程中需要检查用户是否取消了当前的操作。
if (bgWorker.CancellationPending == true)
{
    e.Cancel = true;
    break;
}

若果检查实验到用户点击的吊销按钮,就淡出当前的计算进度。上边是点击撤消按钮时要调用的代码:

_demoBGWorker.CancelAsync();

现行壹度足以帮忙打消操作了,火速试试啊!

那一个处理

即使在估测计算进度中发出了13分该怎么处理?有没有艺术知道计算进度已经截至?当然要有,即就是常规的竣事也急需得到总括的结果。

_demoBGWorker.RunWorkerCompleted += BGWorker_RunWorkerCompleted;
private void BGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //如果用户取消了当前操作就关闭窗口。
    if (e.Cancelled)
    {
        this.Close();
    }

    //计算已经结束,需要禁用取消按钮。
    this.btnCancel.Enabled = false;

    //计算过程中的异常会被抓住,在这里可以进行处理。
    if (e.Error != null)
    {
        Type errorType = e.Error.GetType();
        switch (errorType.Name)
        {
            case "ArgumentNullException":
            case "MyException":
                //do something.
                break;
            default:
                //do something.
                break;
        }
    }

    //计算结果信息:e.Result
    //use it do something.
}

RunWorkerCompleted
事件处理函数会在DoWork
事件处理函数再次回到后被调用。通过它大家得以拓展一些运算甘休后的操作,比如禁止使用撤废按钮,非凡处理,结果呈现等。
注意,倘若想要得到e.Result,您要求在BGWorker_DoWork方法中装置 e.Result属性,如:

e.Result = sum;

 

计算,BackgroundWorker
类效率完善且使用便捷,实在是处理异步耗时操作的利器!

特出处理

设若在计算进度中发出了那二个该怎么处理?有未有措施知道总计进程已经停止?当然要有,即便是健康的终止也要求得到总计的结果。

_demoBGWorker.RunWorkerCompleted += BGWorker_RunWorkerCompleted;
private void BGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //如果用户取消了当前操作就关闭窗口。
    if (e.Cancelled)
    {
        this.Close();
    }

    //计算已经结束,需要禁用取消按钮。
    this.btnCancel.Enabled = false;

    //计算过程中的异常会被抓住,在这里可以进行处理。
    if (e.Error != null)
    {
        Type errorType = e.Error.GetType();
        switch (errorType.Name)
        {
            case "ArgumentNullException":
            case "MyException":
                //do something.
                break;
            default:
                //do something.
                break;
        }
    }

    //计算结果信息:e.Result
    //use it do something.
}

RunWorkerCompleted
事件处理函数会在DoWork
事件处理函数重临后被调用。通过它大家能够举香港行政局地运算甘休后的操作,比如禁止使用裁撤按钮,相当处理,结果突显等。
瞩目,倘若想要得到e.Result,您供给在BGWorker_DoWork方法中设置 e.Result属性,如:

e.Result = sum;

 

总计,BackgroundWorker
类成效完善且使用简便,实在是处理异步耗费时间操作的利器!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有