83169


シリアルポートでの受信結果をSQL Serverへ書き込む仕組みを検討しています  
書き込みの間も受信やUIを止められないので非同期での書き込みが必要かと考えました

非同期処理について調べたところasync/awaitを使ったTaskクラスによる実装が見つかりますが、これは非同期処理が終了したらTaskが終了すると理解しています。

これに対して、調べる前のイメージは、DBへアクセスするスレッドが常に存在し、シリアルポートからの受信に応じてDBアクセススレッドへ向かってキューイングするイメージでいたのですが、近年はそのような仕組みは推奨されていないのでしょうか？

「C#
並行処理」などで検索したのですが、DBアクセスするスレッドやプロセスが常に存在するような仕組みは見当たりませんでした。（Taskを使った例は見つかります）

一般的なよくある設計がわからないので、抽象的な質問かと思いますがご教示いただければと思います。

（追記）

> SqlCommand等のDB関連クラスには標準で非同期処理用のメソッド

EntityFrameworkを利用したSQL Serverへのアクセスを行いたいと思っています。

（追記21/10/19）  
非同期という書き方が余計だったかもしれません。  
10数年前のUnixサーバでの記憶ですが、DBアクセスするプロセスを1つ用意し、これにエンキューする仕組みとすることで、その他の処理をブロックせず、要求の順序を維持し、また、DBへの同時アクセスを予防するという設計がありました。  
検索したところ、これに似た仕組みはC#では一般的でないように思われました。  
それならば、ベストプラクティスというか一般的な設計はどのようなものか有識者に教えていただきたいと考え投稿しました。


CC BY-SA 4.0
2021-10-18T03:02:13.003
83153
2021-10-18T23:35:23.863
2021-10-18T23:35:23.863
48687
48687
question
c# sql-server 非同期
C#Windowsフォームアプリにおいて非同期でSQL Serverへの読み書きを行う場合のベストプラクティス


>
> これに対して、調べる前のイメージは、DBへアクセスするスレッドが常に存在し、シリアルポートからの受信に応じてDBアクセススレッドへ向かってキューイングするイメージでいたのですが、近年はそのような仕組みは推奨されていないのでしょうか？

SqlConnection、SqlCommand等のDB関連クラスには標準で非同期処理用のメソッド（末尾がAsyncのもの）があるので、わざわざそのような事はしないのではないでしょうか。  
非同期処理そのものが判らないということであれば、そちらの学習から入ったほうが近道になると思います。  
[async および await を使用した非同期プログラミング](https://docs.microsoft.com/ja-
jp/dotnet/csharp/programming-guide/concepts/async/)


CC BY-SA 4.0
2021-10-18T04:14:47.883
83154
2021-10-18T04:14:47.883
41943
83153
answer


> DBアクセスするスレッドやプロセスが常に存在するような仕組みは見当たりませんでした。

質問者さんの言う「仕組み」は以下の記事の図にある Thread を使うものですよね？ 違います？

<https://atmarkit.itmedia.co.jp/fdotnet/chushin/masterasync_01/masterasync_01_02.html>

であれば、今は ThreadPool を利用した async / awat を使うのが主流です。理由は紹介した記事に書いてあるので読んでください。

EF Core を使うなら、radian さんの回答のコメントで質問者さんが調べた DbContext.SaveChangesAsync で可能です。

> 書き込みの間も受信やUIを止められないので非同期での書き込みが必要かと考えました

そこのところですが、Tread を使う ThreadPool を使うどちらにせよ、UI スレッドとパラレルに実行されるわけではないのはご存じですか？

シングル CPU/コアですと、以下の記事の一番下の図の (2) になります。

<https://atmarkit.itmedia.co.jp/ait/spv/0503/12/news025.html>


CC BY-SA 4.0
2021-10-18T23:01:21.760
83169
2021-10-18T23:10:38.203
2021-10-18T23:10:38.203
43387
43387
83153
answer