[C#] Entity FrameworkのDbContextとスレッドとDisposeの話

  • 投稿日:
  • by
  • Category:

この記事の続き。手こずっているシステムのバグ対応でまた躓いた。

Entity Frameworkなんて使ったことねぇよ。わかんねー

 

事の発端

とある画面を表示する際、初期表示データを取得するためのDBアクセス時にEntity Frameworkが例外エラーを吐くことがある。

A second operation was started on this context before a previous operation completed. This is usually caused by different threads concurrently using the same instance of DbContext. For more information on how to avoid threading issues with DbContext, see https://go.microsoft.com/fwlink/?linkid=2097913.
   at Microsoft.EntityFrameworkCore.Internal.ConcurrencyDetector.EnterCriticalSection()
   at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)
   at NameSpace.DataAccess.CustomerMasterAccess.GetItem(String customerCode) in C:\*****.cs:line 74
   at NameSpace.DataAccess.MasterAccess.GetCustomerName(String customerCode) in C:\*****.cs:line 125
 at NameSpace.Forms.DataInput.SetCustomerName(String customerCode, String customerCode2, String customerCode3) in C:\*****.cs:line 475
   at NameSpace.Forms.DataInput.DisplayItems() in C:\*****.cs:line 90
   at NameSpace.Forms.DataInput.Initial() in C:\*****.cs:line 71
   at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__140_0(Object state)

エラーメッセージでググってみると、「DbContext はスレッドセーフではないので、スレッド間で使いまわしてはいけない」という文言が見つかる。

つまりこのエラーは複数スレッドから同じDbContextにアクセスしてしまったため発生しているようだ(エラーメッセージに書いている通りやね)

[mineo]パケット放題 Plusの通信制限が分かりにくすぎてキレそう

格安モバイル回線(MVNO)の一つであるmineoには「パケット放題 Plus」というオプションがあり、月額350円で1.5Mbpsの通信が使い放題になる。

L_image.jpg

1.5Mbpsあれば画像コンテンツはもちろんのこと、動画コンテンツについても480pならYoutube動画も見られるしビデオ通話もできる。基本的に困ることはない。

 

ただし通信量の制限がある

ただ一つだけ落とし穴があり「3日間で10GB以上利用すると速度制限がかかる」という制約がある。

まぁ本当に無制限となると無茶な使い方をする人が出てくるので仕方がない。

そんなに使うこともないし大丈夫だろう、と思っていた。

[C#] 非同期処理がマジで分からなくて泣きそう

  • 投稿日:
  • by
  • Category:

やたらawaitしてるコードに出会う

他人が作った業務システムの手直ししているとこんなコードに出会った。

string contents1 = await DoSomething1Async();
string contents2 = await DoSomething2Async();
string contents3 = await DoSomething3Async();

DoSomething*Async()を見るとasync修飾子がついてて、それをawaitで受け止めてる形だ。

なんとなく非同期処理だなぁとは分かるが...恥ずかしながら「重い処理を実行するときにUIスレッドをブロックしないために使うアレね」ぐらいの認識。

これまでは「どうせ読み込み終わるまで次に進めないんだからUIなんてフリーズさせとけ!」の脳筋バカ思考だったので、ちょうどいい機会ということで勉強することに。

 

とりあえずasync/awaitだけでいい

↑にすべてが書いてある。

非同期にしたい関数の呼び出し元にawaitを付けて、呼び出し先の関数の戻り値をasync Task<T>にする。基本これだけ。

Task.RunとかWaitとかResult要らんし使うな、ということらしい。

あとイベントハンドラのみ戻り値をasync voidに。その時はtry/catchで例外をキャッチしよう。

まずこれを覚えた。

Dell SupportAssistが起動しない(インストールできない)時は.NET 5のランタイムを入れよう

先日の事件もあり、Dellのプリインストールアプリを見直していた。

その中でDell SupportAssistという各種ドライバやBIOSを自動で更新してくれるアプリを起動してみたが、いくつかあるDell PCのうちメインPCだけ起動しない。

起動時に「再起動後に再度実行しろ」とエラーメッセージが出るが何度再起動してもダメ。

一度アンインストールしてみて再度インストールしようとしても途中でエラーが出て失敗。

Clipboard01.jpg

だからPCの再起動は死ぬほどやったんだって...。どうすればええねん。

msconfigの「システムサービスを読み込む」をチェック外したらログインできなくなって死んだ話

Windows11のDell PCを買ってから、USBメモリ上のExcelファイルを上書き保存すると.tmpがファイルが消されずに残り続けるようになった。

わりと既知の現象らしいが、これと言って明確な解決方法が見つからない。

そんななか、Yahoo!知恵袋

msconfigから システムサービスを読み込む のチェックを外してOKを押して再起動する

と書いてあったためやってみたら、ログインが一切できなくなった。どうして。