C# BackgroundWorker 详解

在C#次第中,平常会有一些耗费时间较长的CPU密集型运算,假诺直白在
UI
线程实践那样的演算就会现出UI不响应的主题材料。消除那类难点的重要门路是选取多线程,运营四个后台线程,把运算操作放在那些后台线程中完毕。可是原生接口的线程操作有局地难度,假如要更进一步的去做到线程间的通讯就会难上加难。

C# BackgroundWorker 详解

 

在C#次第中,常常会有局部耗时较长的CPU密集型运算,若是一向在 UI
线程实行这样的运算就会产出UI不响应的主题材料。消除那类难点的显要路子是选用拾二线程,运行八个后台线程,把运算操作放在那个后台线程中落成。不过原生接口的线程操作有1对难度,如若要更进一步的去落成线程间的通讯就会难上加难。

幸好 .NET 类库中提供了四个称呼 BackgroundWorker
的类能够相比较优雅的化解那类难点。固然BackgroundWorker
类使用起来比较简单,但个中照旧有局地亟需小心的底细,下边大家就由此 demo
程序介绍它的首要用法。大家在
demo中计算1到拾0的丰裕和,为了演示,每一次计算都 sleep 600阿秒,demo
的UI为:

亚洲必赢官网 1

在C#先后中,平时会有一些耗费时间较长的CPU密集型运算,假使平昔在
UI
线程施行那样的运算就会冒出UI不响应的问题。消除这类难题的要紧渠道是采用四线程,运维三个后台线程,把运算操作放在这几个后台线程中成功。可是原生接口的线程操作有部分难度,假使要更进一步的去完毕线程间的通讯就会难上加难。

C# BackgroundWorker 详解,

在C#程序中,平常会有局地耗费时间较长的CPU密集型运算,假若直接在 UI
线程试行那样的运算就汇合世UI不响应的难点。消除那类难点的要紧路子是使用拾2线程,运转一个后台线程,把运算操作放在这些后台线程中成功。可是原生接口的线程操作有壹对难度,要是要更进一步的去实现线程间的通讯就会难上加难。

幸亏 .NET 类库中提供了叁个叫作 BackgroundWorker
的类可以相比优雅的减轻那类难点。就算BackgroundWorker
类使用起来比较轻易,但在那之中依旧有部分亟待注意的细节,下边大家就经过 demo
程序介绍它的显要用法。大家在
demo中计算一到拾0的充分和,为了演示,每一回总括都 sleep 600纳秒,demo
的UI为:

亚洲必赢官网 2

幸而 .NET
类库中提供了贰个名称为 BackgroundWorker
的类能够比较优雅的缓和那类难点。就算BackgroundWorker
类使用起来相比较简单,但里边依旧有一部分亟需注意的底细,上边大家就经过 demo
程序介绍它的主要用法。咱们在
demo中总括一到十0的增加和,为了演示,每一趟总括都 sleep 600微秒,demo
的UI为:

用法概述

在窗体上创设2个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上该怎么做?
比如大家想要撤废正在开始展览的演算该如何是好?
C# BackgroundWorker 详解。若果运算进度出现分外大家又该怎么样管理?

接下去大家就1个三个的管理这一个主题材料。

幸亏 .NET
类库中提供了1个誉为 BackgroundWorker
的类能够相比较优雅的消除那类难点。即便BackgroundWorker
类使用起来相比简单,但里面如故有一些供给小心的底细,上边大家就因此 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上该怎么办?
一旦大家想要撤除正在拓展的运算该怎么做?
如若运算进程出现极度大家又该怎么管理?

接下去我们就三个多少个的拍卖这一个难点。

亚洲必赢官网 5

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

一贯把100写死到运算进程中可倒霉,我们还筹划允许用户钦赐求和的范围吗!所以要求把100当作参数传递给计算进度。在概述中大家因此调用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,今后早已足以看到进程条和推行音信的换代了。

用法概述

在窗体上构建贰个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上该如何做?
假诺大家想要打消正在展开的运算该怎么做?
假使运算进度出现极度大家又该怎么管理?

接下去大家就3个3个的管理这么些题目。

把新闻传递给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属性传来了我们目的在于的演算消息。

撤废操作

在施行进程中允许用户撤销当前的操作是多个骨干的规划,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();

未来1度可以帮衬裁撤操作了,快速试试啊!

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

直白把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属性传来了大家希望的演算消息。

撤回操作

亚洲必赢官网,在实践进程中允许用户撤销当前的操作是二个基本的统一希图,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,现在曾经得以见到进程条和实行消息的换代了。

格外处理

即使在企图进程中发出了那多少个该怎么管理?有未有点子知道总计进程已经终结?当然要有,即正是健康的终止也亟需拿到计算的结果。

亚洲必赢官网 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
事件处理函数重临后被调用。通过它我们得以拓展一些运算甘休后的操作,举个例子禁止使用撤废开关,相当管理,结果突显等。
留神,假设想要获得 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属性同样,如果要帮忙裁撤操作大家需求设置
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();

于今①度得以扶助打消操作了,火速试试啊!

11分管理

假使在测算进程中发生了充足该怎么管理?有未有法子知道计算进度已经完毕?当然要有,即正是健康的终止也须要获得总结的结果。

_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地图