第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Async / await vs BackgroundWorker

Async / await vs BackgroundWorker

哆啦的時光機 2019-08-30 14:54:44
在過去的幾天里,我測試了.net 4.5和c#5的新功能。我喜歡它的新async / await功能。之前我曾使用BackgroundWorker通過響應式UI在后臺處理更長的進程。我的問題是:在擁有這些不錯的新功能之后,我何時應該使用async / await和什么時候使用BackgroundWorker?兩者的常見情況是什么?
查看完整描述

3 回答

?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

async / await旨在替換諸如BackgroundWorker。之類的結構。如果你愿意,你當然可以使用它,你應該能夠使用async / await和其他一些TPL工具來處理那里的所有內容。

由于兩者都起作用,因此歸結為個人偏好,以及您何時使用。什么對更快?什么是更容易為理解嗎?


查看完整回答
反對 回復 2019-08-30
?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

這可能是TL; DR為多,但是,我認為比較await有BackgroundWorker就是喜歡上了這后續(xù)比較蘋果和桔子和我的想法:


BackgroundWorker用于在線程池線程上為您要在后臺執(zhí)行的單個任務建模。  async/ await是異步等待異步操作的語法。這些操作可能會也可能不會使用線程池線程甚至使用任何其他線程。所以,他們是蘋果和橘子。


例如,您可以執(zhí)行以下操作await:


using (WebResponse response = await webReq.GetResponseAsync())

{

    using (Stream responseStream = response.GetResponseStream())

    {

        int bytesRead = await responseStream.ReadAsync(buffer, 0, buffer.Length);

    }

}

但是,您可能永遠不會在后臺工作程序中對此進行建模,您可能會在.NET 4.0(之前await)中執(zhí)行類似的操作:


webReq.BeginGetResponse(ar =>

{

    WebResponse response = webReq.EndGetResponse(ar);

    Stream responseStream = response.GetResponseStream();

    responseStream.BeginRead(buffer, 0, buffer.Length, ar2 =>

    {

        int bytesRead = responseStream.EndRead(ar2);

        responseStream.Dispose();

        ((IDisposable) response).Dispose();

    }, null);

}, null);

請注意比較了兩種語法,以及如何你不能使用的處置不相交using無async/ await。


但是,你不會做那樣的事情BackgroundWorker。  BackgroundWorker通常用于建模您不希望影響UI響應的單個長時間運行操作。例如:


worker.DoWork += (sender, e) =>

                    {

                    int i = 0;

                    // simulate lengthy operation

                    Stopwatch sw = Stopwatch.StartNew();

                    while (sw.Elapsed.TotalSeconds < 1)

                        ++i;

                    };

worker.RunWorkerCompleted += (sender, eventArgs) =>

                                {

                                    // TODO: do something on the UI thread, like

                                    // update status or display "result"

                                };

worker.RunWorkerAsync();

你真的沒有什么可以使用async / await,BackgroundWorker為你創(chuàng)建線程。


現在,您可以使用TPL代替:


var synchronizationContext = TaskScheduler.FromCurrentSynchronizationContext();

Task.Factory.StartNew(() =>

                      {

                        int i = 0;

                        // simulate lengthy operation

                        Stopwatch sw = Stopwatch.StartNew();

                        while (sw.Elapsed.TotalSeconds < 1)

                            ++i;

                      }).ContinueWith(t=>

                                      {

                                        // TODO: do something on the UI thread, like

                                        // update status or display "result"

                                      }, synchronizationContext);

在這種情況下,TaskScheduler為您創(chuàng)建線程(假設默認值TaskScheduler),并可以使用await如下:


await Task.Factory.StartNew(() =>

                  {

                    int i = 0;

                    // simulate lengthy operation

                    Stopwatch sw = Stopwatch.StartNew();

                    while (sw.Elapsed.TotalSeconds < 1)

                        ++i;

                  });

// TODO: do something on the UI thread, like

// update status or display "result"

在我看來,一個重要的比較是你是否報告進展。例如,你可能有BackgroundWorker like這個:


BackgroundWorker worker = new BackgroundWorker();

worker.WorkerReportsProgress = true;

worker.ProgressChanged += (sender, eventArgs) =>

                            {

                            // TODO: something with progress, like update progress bar


                            };

worker.DoWork += (sender, e) =>

                 {

                    int i = 0;

                    // simulate lengthy operation

                    Stopwatch sw = Stopwatch.StartNew();

                    while (sw.Elapsed.TotalSeconds < 1)

                    {

                        if ((sw.Elapsed.TotalMilliseconds%100) == 0)

                            ((BackgroundWorker)sender).ReportProgress((int) (1000 / sw.ElapsedMilliseconds));

                        ++i;

                    }

                 };

worker.RunWorkerCompleted += (sender, eventArgs) =>

                                {

                                    // do something on the UI thread, like

                                    // update status or display "result"

                                };

worker.RunWorkerAsync();

但是,你不會處理一些這一點,因為你會拖和拖放到窗體的設計表面的背景工作者組成部分-這是你不能做async/ await和Task...即你贏了” t手動創(chuàng)建對象,設置屬性并設置事件處理程序。你只填寫的身體DoWork,RunWorkerCompleted和ProgressChanged事件處理程序。


如果您將其“轉換”為異步/等待,您可以執(zhí)行以下操作:


     IProgress<int> progress = new Progress<int>();


     progress.ProgressChanged += ( s, e ) =>

        {

           // TODO: do something with e.ProgressPercentage

           // like update progress bar

        };


     await Task.Factory.StartNew(() =>

                  {

                    int i = 0;

                    // simulate lengthy operation

                    Stopwatch sw = Stopwatch.StartNew();

                    while (sw.Elapsed.TotalSeconds < 1)

                    {

                        if ((sw.Elapsed.TotalMilliseconds%100) == 0)

                        {

                            progress.Report((int) (1000 / sw.ElapsedMilliseconds))

                        }

                        ++i;

                    }

                  });

// TODO: do something on the UI thread, like

// update status or display "result"

如果沒有將組件拖到Designer表面的能力,那么由讀者來決定哪個“更好”。但是,對我來說,這是和之間的比較,await而BackgroundWorker不是你是否可以等待內置方法Stream.ReadAsync。例如,如果您BackgroundWorker按預期使用,可能很難轉換為使用await。


其他想法:http://jeremybytes.blogspot.ca/2012/05/backgroundworker-component-im-not-dead.html


查看完整回答
反對 回復 2019-08-30
  • 3 回答
  • 0 關注
  • 810 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號