Асинхронные задачи и многопоточность в приложениях .Net с интеграцией SQL Server - PullRequest
0 голосов
/ 25 августа 2018

Описание проблемы : Я занимаюсь разработкой приложения .Net с взаимодействием с SQL Server.Это означает, что конечный пользователь может создавать / обновлять / удалять записи на стороне SQL Server из приложения.

Недавно я попробовал свое приложение, когда понял, что пользовательский интерфейс останавливается на пару секунд, пока не завершатся транзакции между приложением и SQL Server, затем пользовательский интерфейс снова начинает работать.Конечно, это не очень хороший сценарий для конечного пользователя.Поэтому я начал применять многопоточность к своему приложению, но понял, что не могу предоставить доступ к форме, пока не закончится процесс сохранения.

Например: форма с одним элементом управления 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 Ответ

0 голосов
/ 25 августа 2018

Несколько вещей:

  1. Вы управляете между пользовательским интерфейсом и базой данных в пользовательском интерфейсе и затем возвращаетесь в базу данных.По крайней мере, из того, что видно в вашем коде, это не нужно и приводит к ненужным задержкам в сети, низкой производительности и вообще не обрабатывает сценарии сбоев.Попробуйте выполнить пакетную обработку вызовов в базе данных, например, передать TextEdit1.Text и TextEdit2.Text в один вызов хранимой процедуры или базы данных и при необходимости вернуть назад SavedID.

  2. На самом деле вы не следуете никаким шаблонам для наслоения или стратификации.Посмотрите на шаблон репозитория и убедитесь, что вы понимаете SRP (принцип единой ответственности).Пользовательский интерфейс предназначен только для логики представления, а не для вызовов базы данных.

  3. Как уже сообщали другие, вы открываете свое приложение для атак с использованием SQL-инъекций.Это серьезная угроза безопасности.

  4. Вам не нужна многопоточность.Вы могли бы извлечь выгоду из асинхронного / TPL, хотя.Посмотрите на асинхронную библиотеку ADO.NET - ExecuteReaderAsync, ExecuteScalarAsync, ExecuteNonReaderAsync: https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.executereaderasync?view=netframework-4.7.2

  5. Асинхронизация позволяет выполнять задачи параллельно, используя один поток.Это сделает ваш пользовательский интерфейс отзывчивым по мере выполнения фоновых задач SQL.

...