C# BackgroundWorker 详解

在C#次第中,平常会有一部分耗费时间较长的CPU密集型运算,假使从来在
UI
线程执行那样的运算就会师世UI不响应的难点。解决这类难点的关键途径是采用多线程,运转一个后台线程,把运算操作放在那些后台线程中完毕。不过原生接口的线程操作有一部分难度,假若要更进一步的去做到线程间的通信就会难上加难。

C# BackgroundWorker 详解

 

C# BackgroundWorker 详解。在C#先后中,常常会有局部耗费时间较长的CPU密集型运算,若是直接在 UI
线程执行那样的演算就会合世UI不响应的标题。化解那类难题的重大途径是采用10贰线程,运行二个后台线程,把运算操作放在那几个后台线程中成就。但是原生接口的线程操作有局地难度,假设要更进一步的去做到线程间的通讯就会难上加难。

幸亏 .NET 类库中提供了一个誉为 BackgroundWorker
的类能够比较优雅的消除那类难题。尽管BackgroundWorker
类使用起来相比较不难,但中间照旧有局部急需留意的底细,上边大家就经过 demo
程序介绍它的第3用法。我们在
demo中总计一到100的丰裕和,为了演示,每一次计算都 sleep 600飞秒,demo
的UI为:

澳门葡京备用网址 1

在C#次第中,常常会有1部分耗时较长的CPU密集型运算,借使平昔在
UI
线程执行那样的运算就会冒出UI不响应的难题。化解那类难题的基本点路径是选择八线程,运维3个后台线程,把运算操作放在这一个后台线程中做到。但是原生接口的线程操作有壹部分难度,固然要更进一步的去完成线程间的通讯就会难上加难。

C# BackgroundWorker 详解,

在C#程序中,平时会有部分耗费时间较长的CPU密集型运算,假如直接在 UI
线程执行这样的运算就会冒出UI不响应的标题。解决那类难点的最紧要路径是采取十六线程,运转3个后台线程,把运算操作放在那几个后台线程中完成。可是原生接口的线程操作有部分难度,假若要更进一步的去实现线程间的通讯就会难上加难。

万幸 .NET 类库中提供了一个叫做 BackgroundWorker
的类能够比较优雅的消除这类难点。纵然BackgroundWorker
类使用起来相比不难,但在那之中照旧有局地供给注意的细节,上面大家就经过 demo
程序介绍它的关键用法。我们在
demo中统计一到拾0的充裕和,为了演示,每一趟计算都 sleep 600纳秒,demo
的UI为:

澳门葡京备用网址 2

幸而 .NET
类库中提供了一个称呼 BackgroundWorker
的类能够相比较优雅的消除那类难题。即便BackgroundWorker
类使用起来相比简单,但内部依旧有一些索要留意的细节,上面大家就透过 demo
程序介绍它的机要用法。我们在
demo中计算1到拾0的增进和,为了演示,每一趟总括都 sleep 600飞秒,demo
的UI为:

用法概述

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

澳门葡京备用网址 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;
    }
}

澳门葡京备用网址 4

是还是不是有点太不难了?那么让大家考虑上边的难点:

若是大家想要把参数字传送递给运算进程该如何做?
在运算进程中我们意在把实时的音讯显示在UI上该如何是好?
壹旦大家想要撤消正在进行的演算该如何是好?
只要运算进度现身非常大家又该怎么处理?

接下去大家就叁个三个的处理这么些题材。

辛亏 .NET
类库中提供了一个名叫 BackgroundWorker
的类能够比较优雅的消除那类难点。纵然BackgroundWorker
类使用起来相比不难,但里面依旧有1些内需留意的底细,上边我们就透过 demo
程序介绍它的首要性用法。我们在
demo中总计1到十0的充足和,为了演示,每一次计算都 sleep 600皮秒,demo
的UI为:

用法概述

在窗体上营造多少个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上该如何是好?
若是我们想要废除正在拓展的运算该怎么做?
如果运算进度现身很是大家又该怎么样处理?

接下去大家就三个三个的拍卖那么些题材。

澳门葡京备用网址 5

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

一贯把拾0写死到运算进度中可倒霉,我们还打算允许用户钦命求和的界定吗!所以必要把十0看成参数字传送递给计算进度。在概述中我们透过调用RunWorkerAsync方法运营计算进程,其实那么些方法还行一个object 类型的参数。通过它大家就足以把其他数据传递给总计过程:

澳门葡京备用网址 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;
    }
}

澳门葡京备用网址 7

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

澳门葡京备用网址 8

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

一贯把十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
实例,在它的
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
事件添加处理格局:

澳门葡京备用网址 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;
}

澳门葡京备用网址 10

持续创新 BGWorker_DoWork方法:

澳门葡京备用网址 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);
    }
}

澳门葡京备用网址 12

OK,今后早就能够看出进程条和履行新闻的翻新了。

用法概述

在窗体上营造2个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,现在早已能够见到进度条和推行音信的翻新了。

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

一向把十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属性传来了大家希望的运算新闻。

撤废操作

在实施进度中允许用户打消当前的操作是一个主题的设计,BackgroundWorker自然有很好的支持:

_demoBGWorker.WorkerSupportsCancellation = true;

和WorkerReportsProgress属性①样,假使要援救撤销操作大家供给设置
WorkerSupportsCancellation属性为
true。并且还要在BGWorker_DoWork方法中展费用持,在 for 循环中
Thread.Sleep(600)前边添加代码:

澳门葡京备用网址 13

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

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

澳门葡京备用网址 14

即使检查实验到用户点击的撤除按钮,就淡出当前的乘除进度。下边是点击撤销按钮时要调用的代码:

_demoBGWorker.CancelAsync();

今昔早就足以辅助打消操作了,急速试试啊!

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

一向把十0写死到运算进程中可不佳,大家还打算允许用户钦点求和的范围吗!所以须要把十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属性传来了大家希望的运算音信。

裁撤操作

在实施进程中允许用户撤废当前的操作是三个骨干的设计,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;
}

1旦检查测试到用户点击的裁撤按钮,就退出当前的计量过程。上面是点击撤消按钮时要调用的代码:

_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,以往曾经足以观察进度条和进行音讯的翻新了。

不行处理

比方在测算进度中发出了那些该怎么处理?有未有方法知道总结进程已经终止?当然要有,即就是平常的扫尾也急需拿到计算的结果。

澳门葡京备用网址 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.
}

澳门葡京备用网址 16

RunWorkerCompleted 事件处理函数会在DoWork
事件处理函数重回后被调用。通过它我们得以拓展1些运算停止后的操作,比如禁止使用撤消按钮,很是处理,结果突显等。
留神,假如想要得到 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;
}

持续立异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();

今昔早已足以协理撤除操作了,快捷试试啊!

充裕处理

假诺在测算进程中产生了老大该怎么处理?有未有方法知道总计进度已经终止?当然要有,即就是健康的终止也急需得到总结的结果。

_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
类作用完善且使用便捷,实在是拍卖异步耗时操作的利器!

相当处理

就算在计算进程中产生了那1个该怎么处理?有未有措施知道总结进程已经终结?当然要有,即就是健康的终结也亟需获得计算的结果。

_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
类功用完善且使用方便,实在是处理异步耗费时间操作的利器!

相关文章

发表评论

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

*
*
Website