C#多線(xiàn)程控制進(jìn)度條之長(zhǎng)任務(wù)操作
C#多線(xiàn)程控制進(jìn)度條之長(zhǎng)任務(wù)操作
許多種類(lèi)的應(yīng)用程序都需要長(zhǎng)時(shí)間操作,比如:執(zhí)行一個(gè)打印任務(wù),請(qǐng)求一個(gè) Web Service 調(diào)用等。用戶(hù)在這種情況下一般會(huì)去轉(zhuǎn)移做其他事情來(lái)等待任務(wù)的完成,同時(shí)還希望隨時(shí)可以監(jiān)控任務(wù)的執(zhí)行進(jìn)度。
C#多線(xiàn)程控制進(jìn)度條之長(zhǎng)任務(wù)操作圖1
下面的代碼片斷示例了當(dāng)長(zhǎng)任務(wù)執(zhí)行時(shí)用戶(hù)界面是如何被更新的。
- // 顯示進(jìn)度條 ,C#多線(xiàn)程控制進(jìn)度條之長(zhǎng)任務(wù)操作
- void ShowProgress( int totalStep, int currentStep )
- {
- _Progress.Maximum = totalStep;
- _Progress.Value = currentStep;
- }
- // 執(zhí)行任務(wù)
- void RunTask( int seconds )
- {
- // 每 1 / 4 秒 顯示進(jìn)度一次
- for( int i = 0; i < seconds * 4; i++ )
- {
- Thread.Sleep( 250 );
- // 顯示進(jìn)度條 ,C#多線(xiàn)程控制進(jìn)度條之長(zhǎng)任務(wù)操作
- ShowProgress( seconds * 4, i + 1 );
- }
- }
- private void _btnRun_Click(
- object sender, System.EventArgs e )
- {
- RunTask( Convert.ToInt32( _txtSecond.Value ) );
- }
當(dāng)我們運(yùn)行上面的程序,在整個(gè)長(zhǎng)任務(wù)的過(guò)程中,沒(méi)有出現(xiàn)任何問(wèn)題。這樣就真的沒(méi)有問(wèn)題了嗎?當(dāng)我們切換應(yīng)用程序去做其他事情后再切換回來(lái),問(wèn)題就發(fā)生了!主窗體就會(huì)出現(xiàn)如下情況:
C#多線(xiàn)程控制進(jìn)度條之長(zhǎng)任務(wù)操作圖2
這個(gè)問(wèn)題當(dāng)然會(huì)發(fā)生,因?yàn)槲覀儸F(xiàn)在的應(yīng)用程序是單線(xiàn)程的,因此,當(dāng)線(xiàn)程執(zhí)行長(zhǎng)任務(wù)時(shí),它同時(shí)也就不能重畫(huà)用戶(hù)界面了。
為什么在我們切換應(yīng)用程序后,問(wèn)題才發(fā)生呢?這是因?yàn)楫?dāng)你切換當(dāng)前應(yīng)用程序到后臺(tái)再切換回前臺(tái)時(shí),我們需要重畫(huà)整個(gè)用戶(hù)界面。但是應(yīng)用程序正在執(zhí)行長(zhǎng)任務(wù),根本沒(méi)有時(shí)間處理用戶(hù)界面的重畫(huà),問(wèn)題就會(huì)發(fā)生。
如何解決問(wèn)題呢?我們需要將長(zhǎng)任務(wù)放在后臺(tái)運(yùn)行,把用戶(hù)界面線(xiàn)程解放出來(lái),因此我們需要另外一個(gè)線(xiàn)程。
C#多線(xiàn)程控制進(jìn)度條之長(zhǎng)任務(wù)操作的基本情況就向你介紹到這里,希望對(duì)你學(xué)習(xí)和了解C#多線(xiàn)程控制進(jìn)度條之長(zhǎng)任務(wù)操作有所幫助。
【編輯推薦】