C#异步的世界【上】 – 农码一生

新的高级次员可能性异步、等候多用,却对在前方的异步相识甚少。我执意这样的事物的,从此处企图回译竞争下异步的进化史。 

本文首要是回译async异步制作制作模型在前方的异步,下篇文字复发作主旨发言辨析async异步制作制作模型。

APM

APM 异步制作节目制作模型,Asynchronous Programming Model

远在C # 1,有APM。它不太熟识它。,但我见过很人。这是这类beginxxx和EndXXX的方式,和beginxxx归还IAsyncResult交界面。

在正式调解APM示例在前方,咱们先预约单独戏剧。同时存在的行为准则

//1、同时存在的方式privatevoid button1_Click(object sender, EventArgs e)
{          
    ("[调试]螺纹ID" + );

    var request = ("");为了更合适的的显示音响效果,咱们运用网速较慢的电网络。
    ();//发送回避    
    ("[调试]螺纹ID" + );
    label1.Text = "给予帮助取得!";
}

【阐明】为了更合适的的演示异步音响效果,在这时咱们用WinForm次做侦查。(由于WinForm不断地必要单独UI螺纹绘制交界面,假使UI螺纹运用会呈现哄活泼)

[音响效果图]

主教教区这张相片:

  • 咱们在给予帮助方式的时辰浏览呈现了“诈死”,不要拖。
  • 咱们主教教区蜡纸油印件坐果,螺纹ID在换乘在前方和随后是9(或同样地的螺纹)。

如今让咱们揭示通信的的异步方式:(BeginGetResponse、EndGetResponse类似的APM异步制作模型

privatevoid button2_Click(object sender, EventArgs e)
{
    //1、APM 异步制作节目制作模型,Asynchronous Programming Model
    //C#1[本IAsyncResult交界面成真BeginXXX和EndXXX的方式]             
    ("[调试]主螺纹ID" + );

    var request = ("");
    (new AsyncCallback(t =>回调取得后
    {
        var response = (t);
        var stream = ();//获取归还数据流 using (StreamReader reader = new StreamReader(stream))
        {
            StringBuilder sb = new StringBuilder();
            while (!)
            {
                var content = ();
                (情节)
            }
            ("【Debug】" + trim()。子串0, 100) + "...");//只需归还归还情节的前100个性格。 
            ("【Debug】异步螺纹ID:" + );
            (行为) => { label1.Text = "给予帮助取得!"; }));//在这时必要处置对UI的穿插螺纹叫。        }
    }), null);

    ("[调试]主螺纹ID" + ); 
}

[音响效果图]

 农码一生

主教教区这张相片:

  • 启用异步方式并缺少是UI交界面卡死
  • 异步方式启动了另一边单独ID为12的螺纹

从一边至另一边行为准则给予帮助次:

在咱们优于,咱们说,APM的bebinxxx葡萄汁归还的IAsyncResult交界面。而且咱们辨析IAsyncResult交界面:

率先,咱们主教教区:

它归还的IAsyncResult交界面。IAsyncResult注意像什么?:

这不像我设想的左右复杂。。咱们可以试试同样来成真同样交界面吗?,而且显示本人的异步方式呢?

率先,发觉单独类mywebrequest,而且继任IAsyncResult:(以下是根本的伪行为准则成真)

publicclass MyWebRequest : IAsyncResult
{
    publicobject AsyncState
    {
        get { thrownew NotImplementedException(); }
    }

    public WaitHandle AsyncWaitHandle
    {
        get { thrownew NotImplementedException(); }
    }

    publicbool CompletedSynchronously
    {
        get { thrownew NotImplementedException(); }
    }

    publicbool 取得
    {
        get { thrownew NotImplementedException(); }
    }
}

这相对不克不及运用。,最少的也得有个存回权利转移证书数的属性吧,如今咱们短时期更衣:

而且咱们可以自限制APM异步制作模型了:(一对开端、完毕)

public IAsyncResult MyBeginXX(AsyncCallback 回调)
{
    var asyncResult = new MyWebRequest(callback, null);
    var request = ("");
    new Thread(() =>  //重行启用螺纹    {
        using (StreamReader sr = new StreamReader(().GetResponseStream()))
        {
            var str = ();
            (STR)//设置异步坐果        }

    }).Start();
    return asyncResult;//返归还的IAsyncResult}

publicstring MyEndXX(IAsyncResult asyncResult)
{
    MyWebRequest result = asyncResult as MyWebRequest;
    return result.Result;
}

拨打以下

privatevoid button4_Click(object sender, EventArgs e)
 {
     ("[调试]主螺纹ID" + );
     MyBeginXX(new AsyncCallback(t =>
     {
         var result = MyEndXX(t);
         ("【Debug】" + ().Substring(0, 100) + "...");
         ("【Debug】异步螺纹ID:" + );
     }));
     ("[调试]主螺纹ID" + );
 }

音响效果图:

农码一生

咱们主教教区,咱们的成真音响效果与P根本同样地。。

  • 启用异步方式并缺少是UI交界面卡死
  • 异步方式启动了另一边单独ID为11的螺纹

[摘要]

分类人事广告版觉得APM异步制作制作模型执意启用另一边单独螺纹给予帮助旷日持久的布道所,而且,后续用手操作由回权利转移证书数给予帮助。。

APM还可以以对立的事物方式到达值。,如:

while (!)//传送,直到异步给予帮助取得 (开票)
{
    (100);
}
var stream2 = (asyncResult).GetResponseStream();

();嵌线,直到异步取得 (闭塞等候)
var stream2 = (asyncResult).GetResponseStream();

暂代他人职务:假使这是一种经用的方式,咱们也可以经过付托异步:(BeginInvoke、EndInvoke)

publicvoid MyAction()
 {
     var func = new Func<string, string>(t =>
     {
         (2000);
         return"name:" + t + ();
     });
 
     var asyncResult = ("有害的幼虫", t =>
     {
         string str = (t);
         (STR)
     }, null); 
 }

EAP

EAP 本事变的异步制作制作模型,Event-based Asynchronous Pattern

同样制作制作模型是跟随C # 2。

先看单独EAP示例:

privatevoid button3_Click(object sender, EventArgs e)
 {            
     ("[调试]主螺纹ID" + );

     BackgroundWorker worker = new BackgroundWorker();
     worker.DoWork += new DoWorkEventHandler((s1, S2) =>
     {
         (2000);
         ("【Debug】异步螺纹ID:" + );
     });//加入事变来成真异步
     (this);
     ("[调试]主螺纹ID" + );
 }

[音响效果图](同时不闭塞UI交界面)

[指向]

  • 以事变的方式加入回权利转移证书数
  • 经过 XXXAsync方式来给予帮助异步换乘

同样侦查很简略。,要不是与APM制作模型比拟,它过失左右清澈的和清澈的吗?。为什么可以这样的事物成真?事变的加入是在干嘛?为什么给予帮助RunWorkerAsync会罢加入的重大聚会?

我觉得你想得更多。

咱们结局反编译程序和检查源行为准则:

 只想说,左右玩,有意思吗?

TAP

TAP 本布道所的异步制作制作模型,Task-based Asynchronous Pattern

到眼前为止,咱们以为下面的APM、EAP异步制作制作模型资生堂?仿佛缺少获得知识什么成绩。再向外看想想…假使咱们有多个异步方式必要按先后次给予帮助,和必要(首要处理中)获取有归还值。

率先限制三个付托:

public Func<string, string> func1()
{
    returnnew Func<string, string>(t =>
    {
        (2000);
        return"name:" + t;
    });
}
public Func<string, string> func2()
{
    returnnew Func<string, string>(t =>
    {
        (2000);
        return"age:" + t;
    });
}
public Func<string, string> func3()
{
    returnnew Func<string, string>(t =>
    {
        (2000);
        return"sex:" + t;
    });
}

而且按必然的次给予帮助:

publicvoid MyAction()
{
    string str1 = string.Empty, str2 = string.Empty, str3 = string.Empty;
    IAsyncResult asyncResult1 = null, asyncResult2 = null, asyncResult3 = null;
    asyncResult1 = func1().BeginInvoke("有害的幼虫", t =>
    {
        str1 = func1().EndInvoke(t);
        ("【Debug】异步螺纹ID:" + );
        asyncResult2 = func2().BeginInvoke("26", a =>
        {
            str2 = func2().EndInvoke(a);
            ("【Debug】异步螺纹ID:" + );
            asyncResult3 = func3().BeginInvoke("", s =>
            {
                str3 = func3().EndInvoke(s);
                ("【Debug】异步螺纹ID:" + );
            }, null);
        }, null);
    }, null);

    ();
    ();
    ();
    (str1 + str2 + str3);
} 

要不是局促不安、如同不难读懂。 。但那是真的吗?

asyncResult2是null?
从其可见在取得第单独异步用手操作在前方缺少对
asyncresult2分派,asyncResult2给予帮助异步等候的时辰报非常。左右这样的咱们就无法把持三个异步重大聚会,以必然的次给予帮助归还值。。(从在理论上讲,没有活力的对立的事物方式可以做到这点。,无论如何行为准则更复杂。

是的,如今咱们的转节在在舞台上。。

只换乘布道所类的恒稳态方式运转,那就够了轻轻松松运用异步。

获取归还值:

var 布道所1 = Task<string>.Run(() =>
{
    (1500);
    ("【Debug】布道所1 螺纹ID:" + );
    return"有害的幼虫";
});
//对立的事物逻辑            ();
var value = 布道所1.Result;//获取归还值
("【Debug】主 螺纹ID:" + );

如今咱们处置下面多个异步按序给予帮助:

("【Debug】主 螺纹ID:" + );
string str1 = string.Empty, str2 = string.Empty, str3 = string.Empty;
var 布道所1 = (() =>
{
    (500);
    str1 = "姓名:有害的幼虫,";
    ("【Debug】布道所1 螺纹ID:" + );
}).ContinueWith(t =>
{
    (500);
    str2 = "年纪:25,";
    ("【Debug】task2 螺纹ID:" + );
}).ContinueWith(t =>
{
    (500);
    str3 = "利害关系:妹子";
    ("【Debug】task3 螺纹ID:" + );
});

(2500);//对立的事物的逻辑行为准则
();

(str1 + str2 + str3);
("【Debug】主 螺纹ID:" + );

[音响效果图]

咱们主教教区,坐果已到达。,且是异步按序给予帮助的。行为准则的逻辑很卓越的。。假使你感触不太大,左右你景象假使是100个异步方式必要异步按序给予帮助呢?用APM的异步回调,那反正也得异步回调嵌套100次。行为准则的不同族是可以设想的。。

涂心理

  • WaitOne等候取得的初步

  • 异步为什么会提出功能

  • 运用的螺纹数和

成绩1:WaitOne等候取得的初步

在此在前方,让咱们从简略地相识下单独多螺纹喷射器把持开端。。

var _asyncWaitHandle = new AutoResetEvent(false);
();

此行为准则将在WaitOne同样地方会等相当长的时期的。。除非有另单独螺纹给予帮助AutoResetEvent设定方式。

var _asyncWaitHandle = new AutoResetEvent(false);
();
();

这样的,到了 WaitOne它可以直接地给予帮助。。不要等候无论哪些等候。

如今咱们在APM上 异步制作节目制作模型正中鹄的 WaitOne等一下,你认识是什么吗?。咱们掉头来实如今前方自限制异步方式的异步等候。

publicclass MyWebRequest : IAsyncResult
{
    //异步回权利转移证书数(付托)private AsyncCallback _asyncCallback;
    private AutoResetEvent _asyncWaitHandle;
    public MyWebRequest(AsyncCallback asyncCallback, object 养护)
    {
        _asyncCallback = asyncCallback;
        _asyncWaitHandle = new AutoResetEvent(false);
    }
    //设置的坐果publicvoid SetComplete(string 坐果)
    {
        Result = result;
        取得 = true;
        ();
        if (_asyncCallback != null)
        {
            _asyncCallback(this);
        }
    }
    //异步回避归还值publicstring Result { get; set; }
    //获取用户限制的男朋友,它限或容纳在附近的异步用手操作的新闻。publicobject AsyncState
    {
        get { thrownew NotImplementedException(); }
    }
    // 获取用于等候异步用手操作取得的 。public WaitHandle AsyncWaitHandle
    {
        //get { throw new NotImplementedException(); }get { return _asyncWaitHandle; }
    }
    //获取单独值,该值意思是异步用手操作无论同时存在的取得。publicbool CompletedSynchronously
    {
        get { thrownew NotImplementedException(); }
    }
    //获取单独值,该值意思是异步用手操作无论已取得。publicbool 取得
    {
        get;
        privateset;
    }
}

白色行为准则执意新增的异步等候。

[给予帮助提议]

成绩2:异步为什么会提出功能

同时存在的行为准则,拿 … 来说:

(10000);//同意这是叫数据库的一种方式。
(10000);//同意这是一件商品叫FQ网站

这段行为准则必要20秒。。

假使是异步:

var task = (() =>
{
    (10000);//同意这是叫数据库的一种方式。});
(10000);//同意这是一件商品叫FQ网站
();

因而只必要10秒。这样的事物可以节省10秒。。

假使是:

var task = (() =>
{
    (10000);//同意这是叫数据库的一种方式。}); 
();

异步给予帮助正中的缺少旷日持久的的行为准则左右这样的事物的异步将是缺少意思的。

或许:

var task = (() =>
{
    (10000);//同意这是叫数据库的一种方式。}); 
();
(10000);//同意这是一件商品叫FQ网站

把旷日持久的布道所放在异步等候后,该行为准则将不会的有功能改善。。

可供选择的事物情境:

假使它是高密度用手操作的单环的CPU,左右异步同样缺少意思的。(由于用手操作很费用CPU),电网络回避等候缺少CPU)

成绩3:运用的螺纹数和

答案无论是。

或许用单独单一的紧排来做同意。

情境1:

long num = 0;
while (true)
{
    num += new 下单独()。100,100);
    //(100);
}

在单环的单环的,咱们只开端单独螺纹,你可以让你的CPU充沛。

开端八次,八进步CPU根本上是满的。。

情境2:

1000多螺纹,CPU的运用率是0。。从其,咱们得到了后面的结局。,运用的螺纹数与。

憎恨这样的,但翻开绽不克不及是无限制的。。由于:

  • 翻开新螺纹的处理全部地费用资源。。(但运用螺纹池),为了缩减翻开新螺纹所消费的资源。
  • 多螺纹排列中的任一组数字或文字也必要时期。。
  • 每个螺纹使忙碌了必然的内存保留螺纹背景新闻。

demo:

本文已同时存在的到搜集列入。:合C #根本知识

由于异步制作节目相识不深,文本中有大量不义的行为的表现和评价。。

谢谢你的雅正。。

基于互相关联的事物议论的作用,有意给错误的劝告每分类人事广告版。。

[挑选]

发表评论

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