簡體   English   中英

.Net 應用程序中的異步任務和多線程與 SQL Server 集成

[英]Async Tasks and Multi-threading in .Net Applications with SQL Server integration

問題描述:我正在開發一個與 SQL Server 交互的 .Net 應用程序。 這意味着最終用戶能夠從應用程序創建/更新/刪除 SQL Server 端的條目。

最近,當我意識到 UI 停止幾秒鍾直到應用程序和 SQL Server 之間的事務完成時,我正在嘗試我的應用程序,然后 UI 再次開始工作。 當然,這對最終用戶來說不是一個好場景。 所以我開始對我的應用程序應用多線程,但我意識到在保存過程完成之前我無法提供對表單的訪問。

例如:一個帶有一個 TextEdit 控件的表單,最終用戶在其中鍵入他的姓名和另一個 TextEdit 控件,最終用戶在其中鍵入他的電話號碼,然后點擊保存按鈕。 從我的應用程序保存 SQL 是

' Variable that holds the row number of the saved username
Dim SavedID as integer

' saving the username to the users table
SavedID = SQLControl.ExecScalar(String.format("INSERT INTO TABLE1 VALUES ({0});)", _
TextEdit1.text))

' saving the user phone number to the phone numbers table
SQLControl.ExecNonQuery(String.format("INSERT INTO TABLE2 VALUES ({0}, {1});)", _
SavedID, TextEdit2.text))

這意味着最終用戶在保存完成之前不應具有訪問權限,因為如果他在執行第二個SQLNonQuery之前具有訪問權限,則數據可能會混亂。

PS:SQLControl.ExecScalar 和 SQLControl.ExecNonQuery 是自定義定義的子程序。

PS:我已經將參數應用於我的代碼,但此代碼僅用於描述我需要找到解決方案的問題。

問題:如果我需要應用異步任務將數據保存到 SQL Server,處理這種情況的最佳做法是什么?

一些東西:

  1. 您在 UI 和數據庫到 UI 之間進行編排,然后再回到數據庫。 至少從您的代碼中可以看出,這是不需要的,並且會導致不必要的網絡延遲、性能不佳並且根本無法處理故障情況。 嘗試對數據庫進行批處理,例如將 TextEdit1.Text 和 TextEdit2.Text 傳遞給單個存儲過程或數據庫調用,並在需要時返回 SavedID。

    1. 您並沒有真正遵循任何分層或分層模式。 查看存儲庫模式並確保您了解 SRP(單一職責原則)。 UI 僅用於表示邏輯,而不用於進行數據庫調用。

    2. 正如其他人在此處發布的那樣,您正在向 SQL 注入攻擊開放您的應用程序。 這是一個重大的安全風險。

    3. 你不需要多線程。 不過,您可以從 async/TPL 中受益。 查看 ADO.NET 異步庫 - ExecuteReaderAsync、ExecuteScalarAsync、ExecuteNonReaderAsync: https ://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.executereaderasync ? view = netframework-4.7.2

    4. Async 允許您使用單個線程並行完成任務。 這將使您的 UI 在后台 SQL 任務完成時具有響應性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM