3 回答

TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個(gè)贊
async / await旨在替換諸如BackgroundWorker
。之類的結(jié)構(gòu)。如果你愿意,你當(dāng)然可以使用它,你應(yīng)該能夠使用async / await和其他一些TPL工具來處理那里的所有內(nèi)容。
由于兩者都起作用,因此歸結(jié)為個(gè)人偏好,以及您何時(shí)使用。什么對(duì)你更快?什么是更容易為你理解嗎?

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
這可能是TL; DR為多,但是,我認(rèn)為比較await有BackgroundWorker就是喜歡上了這后續(xù)比較蘋果和桔子和我的想法:
BackgroundWorker用于在線程池線程上為您要在后臺(tái)執(zhí)行的單個(gè)任務(wù)建模。 async/ await是異步等待異步操作的語(yǔ)法。這些操作可能會(huì)也可能不會(huì)使用線程池線程甚至使用任何其他線程。所以,他們是蘋果和橘子。
例如,您可以執(zhí)行以下操作await:
using (WebResponse response = await webReq.GetResponseAsync())
{
using (Stream responseStream = response.GetResponseStream())
{
int bytesRead = await responseStream.ReadAsync(buffer, 0, buffer.Length);
}
}
但是,您可能永遠(yuǎn)不會(huì)在后臺(tái)工作程序中對(duì)此進(jìn)行建模,您可能會(huì)在.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);
請(qǐng)注意比較了兩種語(yǔ)法,以及如何你不能使用的處置不相交using無(wú)async/ await。
但是,你不會(huì)做那樣的事情BackgroundWorker。 BackgroundWorker通常用于建模您不希望影響UI響應(yīng)的單個(gè)長(zhǎng)時(shí)間運(yùn)行操作。例如:
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)建線程。
現(xiàn)在,您可以使用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)建線程(假設(shè)默認(rèn)值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"
在我看來,一個(gè)重要的比較是你是否報(bào)告進(jìn)展。例如,你可能有BackgroundWorker like這個(gè):
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();
但是,你不會(huì)處理一些這一點(diǎn),因?yàn)槟銜?huì)拖和拖放到窗體的設(shè)計(jì)表面的背景工作者組成部分-這是你不能做async/ await和Task...即你贏了” t手動(dòng)創(chuàng)建對(duì)象,設(shè)置屬性并設(shè)置事件處理程序。你只填寫的身體DoWork,RunWorkerCompleted和ProgressChanged事件處理程序。
如果您將其“轉(zhuǎn)換”為異步/等待,您可以執(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表面的能力,那么由讀者來決定哪個(gè)“更好”。但是,對(duì)我來說,這是和之間的比較,await而BackgroundWorker不是你是否可以等待內(nèi)置方法Stream.ReadAsync。例如,如果您BackgroundWorker按預(yù)期使用,可能很難轉(zhuǎn)換為使用await。
其他想法:http://jeremybytes.blogspot.ca/2012/05/backgroundworker-component-im-not-dead.html
- 3 回答
- 0 關(guān)注
- 797 瀏覽
添加回答
舉報(bào)