人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

在 Visual Basic .NET 中完成后臺進程(3)

在 Visual Basic .NET 中完成后臺進程(3)

更新時間:2022-08-28 文章作者:未知 信息來源:網絡 閱讀次數:


創建顯示的窗體

最后,我們可以創建窗體,將其用于啟動或取消后臺進程。該窗體還將顯示活動和狀態信息。

打開 Form1 的設計器并添加兩個按鈕(btnStartbtnRequestCancel)、兩個標簽(Label1Label2)、一個 ProgressBar (ProgressBar1) 和一個 ActivityBar (ActivityBar1),如圖 7 所示。

在 Visual Basic .NET 中實現后臺進程(三)

圖 7:Form1 控件的布局

該窗體需要實現 IClient,以便 Controller 對象與之交互:

Imports BackgroundPublic Class Form1  Inherits System.Windows.Forms.Form  Implements IClient

該窗體還需要 Controller 對象和一個標志,用以跟蹤后臺操作是處于活動狀態還是處于完成狀態。

  Private mController As New Controller(Me)  Private mActive As Boolean

然后,我們可以添加方法,以實現由 IClient 定義的接口。建議將這些方法放在 Region 中,以表示它們實現的是輔助接口:

#Region " IClient "  Private Sub TaskStarted(ByVal Controller As Controller) _      Implements IClient.Start    mActive = True    Label1.Text = "Starting"    Label2.Text = "0%"    ProgressBar1.Value = 0    ActivityBar1.Start()  End Sub  Private Sub TaskStatus(ByVal Text As String) _      Implements IClient.Display    Label1.Text = Text    Label2.Text = CStr(mController.Percent) & "%"    ProgressBar1.Value = mController.Percent  End Sub  Private Sub TaskFailed(ByVal e As Exception) _      Implements IClient.Failed    ActivityBar1.Stop()    Label1.Text = e.Message    MsgBox(e.ToString)    mActive = False  End Sub  Private Sub TaskCompleted(ByVal Cancelled As Boolean) _      Implements IClient.Completed    Label1.Text = "Completed"    Label2.Text = CStr(mController.Percent) & "%"    ProgressBar1.Value = mController.Percent    ActivityBar1.Stop()    mActive = False  End Sub#End Region

請注意,這一段代碼中的所有內容均與線程無關,其中的每一部分代碼都可以在我們得知后臺操作的狀態時做出相應的響應。每次響應后,我們都會更新顯示以表明進程的狀態和完成百分比(以文字的形式或通過 ProgressBar 顯示),并啟動和停止 ActivityBar 控件。

mActive 標志非常重要。如果用戶在輔助線程處于活動狀態時關閉窗體,應用程序可能會掛起或變得不穩定。要防止出現這種情況,我們可以打斷窗體的 Closing 事件并取消關閉嘗試(如果后臺進程處于活動狀態)。

  Private Sub Form1_Closing(ByVal sender As Object, _    ByVal e As System.ComponentModel.CancelEventArgs) _    Handles MyBase.Closing    e.Cancel = mActive  End Sub

我們還可以選擇在這種情況下初始化取消操作,但是這取決于特定的應用程序要求。

其余的代碼都是為了實現按鈕的 Click 事件。

  Private Sub btnStart_Click(ByVal sender As System.Object, _      ByVal e As System.EventArgs) Handles btnStart.Click    mController.Start(New Worker(2000000, 100))  End Sub  Private Sub btnStop_Click(ByVal sender As System.Object, _      ByVal e As System.EventArgs) Handles btnStop.Click    Label1.Text = "Cancelling ..."    mController.Cancel()  End Sub

Start(開始)按鈕只調用 Controller 對象的 Start 方法,并將 Worker 對象的實例傳遞給它。

您可能需要調整用于初始化 Worker 對象的值,以便在您的計算機上獲得所需的結果。這些特定的值提供了雙處理器 P3/450 計算機上的一個良好示例。顯然,這只是用于測試目的。真正的 Worker 對象將實現更有意義、運行時間更長的進程。

Cancel(取消)按鈕將調用 Controller 對象的 Cancel 方法,同時還會更新顯示,以表明已請求取消。請記住,這只是一個取消“請求”,在輔助線程真正停止運行之前可能需要等待一些時間。最好能夠為用戶提供即時反饋,至少應讓用戶知道系統已經注意到用戶的單擊按鈕操作。

現在,我們可以運行應用程序了。單擊 Start(開始)按鈕時,Worker 就應該開始運行,而且顯示的內容會在運行時更新。您可以將窗體移動到屏幕上的任意位置,也可以與其交互,因為 UI 線程本質上還處于空閑狀態,可以隨時與您交互。

同時,輔助線程在后臺進行大量復雜的工作,并定期將狀態更新信息發送給 UI 線程以進行顯示。

小結

多線程是一個功能強大的工具,我們可以在每次需要執行長時間運行的任務時使用該工具。我們可以用它運行輔助代碼,而無需綁定用戶界面。但同時要注意,多線程操作非常復雜,要正確操作并不容易,而且調試起來也比較困難。

盡管不一定能夠實現,但我們還是應該盡量為每個輔助線程提供一組它可以操作的獨立數據。要達到這個目的,最簡單的方法就是為每個線程創建一個對象,對象中包含該線程可以操作的數據以及完成工作所需的代碼。

通過實現結構化的架構,使之充當輔助線程和 UI 線程之間的媒介,我們可以大大簡化編寫多線程代碼和 UI 以對其進行控制的過程。本文就介紹了這樣一個架構,您可以根據需要使用或進行調整,以滿足特定的應用需要。


溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 南皮县| 庆安县| 正阳县| 广汉市| 莱西市| 泽库县| 墨竹工卡县| 治县。| 汝阳县| 桃源县| 古田县| 漳平市| 桦甸市| 屏边| 基隆市| 财经| 合山市| 溧阳市| 黎平县| 高唐县| 鞍山市| 泌阳县| 孝感市| 垣曲县| 青阳县| 自治县| 新余市| 鹤山市| 天长市| 宁国市| 临沂市| 清丰县| 绥棱县| 出国| 乌恰县| 车致| 益阳市| 广东省| 泊头市| 军事| 叙永县|