
はじめに 登壇版 Taskの本質 C# のイテレータ async/await Compiler Transform ExecutionContext builder.Start() の重要性 IAsyncStateMachine.MoveNext おわりに はじめに C#er は呼吸するように使っている async/await。 そんな async/await について、先日 Stephen Toub 氏 (.NET の中の人。中心人物の一人。) が How Async/Await Really Works in C# という非常に面白い記事を投稿していました。 この記事では Stephen 氏の記事をベースに、C# において async/await は実際どうやって動いてるの?というお話をしていきます。 以前に C#での非同期メソッドの分析。 という翻訳記事を書いたのですが、元になった記
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? はじめに C#におけるasync/awaitを使う上で、絶対に意識しないといけないものは「キャンセル処理」です。 正しく処理をキャンセルしないとメモリリークを起こしたり、デッドロックやデータ不整合を引き起こす可能性があります。 今回はこの「async/awaitにおけるキャンセル処理」について話します。 対象 C#におけるasync/await全般 Task/ValueTask/UniTaskすべてに共通します Unity含む C#のasyc/awaitについてイマイチ自信が持ててない人 先に「結論」 asyncメソッドはCancell
はじめに C#のORマッパーといえばEntity Framework(以下、EF)が有名で、データベースの接続を調べると真っ先にEFの名前が出てきます。ORMの機能を充分に備えたライブラリはEFしかありませんが、致命的な欠点があります。欠点については後述しますが、これを解決するには他のライブラリを使うほかありません。本記事では、EFを使わずにORマッパーの機能を使うライブラリとその組み合わせを紹介します。 ORMの基本的な機能 紹介する前にまずはORMで必要な機能を確認します。ORM(Object-relational mapping)は、オブジェクト関係マッピングと呼ばれ、オブジェクト思考とRDB間の非互換であるデータの違いをうまく吸収(これの逆をインピーダンスミスマッチと言います)して、簡単にデータを扱えるようにする技法です。基本的な機能は以下があります。 SQLを意識することなくコー
C#でSQLite3を使ってみたのでまとめ。DBが1つのファイルで完結するって何かと便利ですよね。 このへんの記事が参考になりました。 SQLite で LINQ を使う : http://www.moonmile.net/blog/archives/7979 C# で SQLite を便利に使うサンプルコード(LINQ to SQLite): http://shinta0806be.ldblog.jp/archives/9084539.html 1.どのパッケージを使う? ここが問題。NuGetで「SQLite」で検索すると、 まずどれを使っていいかわかりません。大抵「System.Data.SQLite」をインストールするのですが、これはEntity Frameworkや、SQLiteのLINQ拡張(これを入れなくてもLINQ to SQLが使える謎)など全部入った欲張りセットで、気づ
C#9.0の進歩が目覚ましいので使いたい .NET5 がリリースされました。C#も9.0となりました。C#9.0は.NET5以降でしか使えません。 .NET5 を使えるプロジェクトではどんどん新しい文法を活用しましょう。 C#9.0の新機能から、素晴らしいと思った部分をまとめてみました。 使いたい理由1 : record class, struct に加えて record を用いて型定義することができます。 変更不可能な参照型とのことです。 public record Person // classのかわりにrecord { public string Name { get; } public DateTime BirthDate { get; } public Person(string name, DateTime birthDate) { Name = name; BirthDate
C#でファイルを削除する際にごみ箱に移す方法について紹介します。 C#にはファイルをごみ箱に移す操作を行うクラス、メソッドが用意されていません。 ですのでVisual Basicのアセンブリを使ってごみ箱に移す処理を行います。 Visual Basicのアセンブリを参照する C#で全角と半角、ひらがなとカタカナの変換を行うために、Visual Basicのアセンブリを参照します。 ソリューション エクスプローラーでアセンブリを追加するプロジェクトのツリーノードを展開します。 展開すると表示されるツリーノードの「参照」を右クリックします。 コンテキストメニューが表示されるので「参照の追加」をクリックします。 「参照マネージャー」ダイアログが表示されますので、左ペインの「アセンブリ」を選択(クリック)し、表示されるアセンブリの一覧から「Microsoft.VisualBasic」を選択(クリッ
その中でも、「相手のポケモンのアイコンを取得して、そのポケモン名を返す」という処理の実装に丸1日使ってしまったので、備忘録も含めて書き残して置こうと思います。 目的 今回作成するプログラムはこんな感じ。 2つの画像ファイルを比較して、その画像がどれぐらい類似しているのかを計算する上記処理について、処理時間10ms以内 作ろうとしているツールがリアルタイム画像解析を必要とするので、処理に時間がかかるとどうしてもリアルタイムにできない部分があります。 ので、高速で処理できて、かつ類似画像の検出率を99%以上を目指します。 アルゴリズム 今回はPerceptual Hashを利用した類似度の計算を行います。 Perceptual Hashにも何種類かあるようなのですが、dHashと言う隣接するピクセルの輝度値?の差分を比較することによるハッシュ計算方法を使います。 詳細はこちらのサイトが参考にな
17年プログラマをやっていて、いまさら i++ がスレッドセーフじゃないことを知った 1 ことを反省しての記事です。 ざっくりいうと C#のインクリメント演算子はスレッドセーフではありません。 スレッドセーフを求める場合は、System.Threading.Interlocked.Incrementを利用しましょう。 System.Threading.Interlocked.Incrementがスレッドセーフたる理由を調べてみた。 本文 検証してみる 以下のMSTestを実行してみたところ、テストはエラーになりました。 [TestMethod] public void TestIncrementersThreadSafe() { var tasks = new List<Task>(); int counter = 0; for (int i = 0; i < 250; i++) { ta
Microsoftが「ML.NET 1.5.2」を公開、.NET開発者向け機械学習フレームワーク:ONNXエクスポートなどの機能も強化 Microsoftは、.NET開発者向けのオープンソース機械学習(ML)フレームワークの最新版「ML.NET 1.5.2」を公開した。Model Builderツールで「Azure ML」を使ってオブジェクト検出モデルをトレーニングできるようになった他、ML.NET CLIで画像分類モデルをローカルでトレーニングすることも可能になった。 Microsoftは2020年9月25日(米国時間)、オープンソースの.NET開発者向けクロスプラットフォーム機械学習(ML)フレームワークの最新版「ML.NET 1.5.2」を公開した。 ML.NETでは、.NETエコシステムから離れることなく、MLやデータサイエンスの経験が乏しい開発者でも、.NETアプリケーションにM
第3回 マルチスレッドでデータの不整合を防ぐための排他制御 ― マルチスレッド・プログラミングにおける排他制御と同期制御(前編) ―:連載.NETマルチスレッド・プログラミング入門(1/3 ページ) 連載目次 前回では、.NETにおけるマルチスレッド・プログラミングの基本的な実装方法についてまとめた。今回および次回では、マルチスレッドを使いこなすうえで欠かせない、スレッドをコントロールするためのプログラミング手法について解説していこう。 排他制御と同期制御とは シングルスレッド・プログラムでは問題にはならないが、マルチスレッド・プログラムで注意をしなくてはならないのが、「排他制御」と「同期制御」である。これらはまとめて同期制御と呼ばれることも多いが、ここでは分かりやすく説明するために、2つに分けて考えることにしたい。 排他制御とは、複数のスレッドから共通のリソース(データ)にほぼ同時にアク
「Try! C# vNext」ということで、次期C#の新機能を少しずつ試していきたいと思います。まず最初は自動実装プロパティ初期化子 (= Auto-property initializers) です。これまではメンバー変数の初期化はクラス宣言と同時にできたのですが、自動実装プロパティはコンストラクタなどでしか初期化ができませんでした。その制約を取り払い、より簡潔な記述を可能にしようというものです。 とりあえず使ってみる 使い方は簡単で、以下のように自動実装プロパティに対して値を代入するように記述するだけです。 class Book { public string Title{ get; set; } = "Untitled"; public int Price{ get; set; } = 100; } これは以下の書き方と等価です。定型的な初期化するだけのコンストラクタがほぼほぼ不要に
Mono is a software platform designed to allow developers to easily create cross platform applications. The Mono Project (mono/mono) (‘original mono’) has been an important part of the .NET ecosystem since it was launched in 2001. Microsoft became the steward of the Mono Project when it acquired Xamarin in 2016. The last major release of the Mono Project was in July 2019, with minor patch releases
更新履歴 2020/03/23 IoT について追記 その他に帝国兵さんのツイートを追加 サーバーレスカテゴリーを追加して AWS Lambda を追加 ASP.NET Core Razor Pages を追記 2020/03/24 kennakamu さんの「個人的に C# が向かないと思うこと」へのリンク追加 本文 昔ブログにこんな記事を書きました。 C# で何か出来るのか?まとめてみた あれから 2 年が経って昔からある Windows 専用の .NET Framework に対する新機能の提供が終わり、クロスプラットフォームに対応した .NET Core が今後のメインストリームとして .NET 5 → .NET 6 のように進化していくことが 2019 年 5 月の Build 2019 で発表されました。以下の Blog 記事がアナウンス後に発表されています。 Introduc
コード書けばすぐわかる事なんですが is 演算子の挙動の話です。 is 演算子は複数の型で true になる可能性があります。 親子関係がある型で厳密に型を判定したい場合、GetType() と typeof を使います。 // こんなクラスがあったとして、、 public class BaseClass { } public class DerivedClass_1 : BaseClass { } public class DerivedClass_2 : BaseClass { } // こんなコードを書いたとすると結果がコメントのようになります static void Main(string[] args) { BaseClass test = new DerivedClass_1(); // is演算子による型判定 Console.WriteLine("test is BaseCl
こんにちは。MLBお兄さんこと松村です。 今回は私がPCに必ずgit cloneしているC#系のGitHubリポジトリを紹介します。 どういったリポジトリであるか、リポジトリをクローンしている目的も併せて書いてみます。 とりあえず詳細はいいから、どんなリポジトリがあるか知りたい方はこちらをご覧ください。 gist.github.com それでは列挙していきます。(アルファベット順です) 常にクローンするもの dotnet-presentations/aspnetcore-app-workshop github.com ASP.NET Core 2.2でSPAのWebアプリケーションを作るワークショップです。 dotnet-presentations/aspnetcore-concepts-workshop github.com 前述の dotnet-presentations/aspnet
上記の通り、HttpClientオブジェクトは一度作成するだけでそれをずっと使い続けるのが正しい使用法です。知ってる人には当然なんですけども、知らないと結構驚くかも知れません。APIドキュメントにはこう書いてあります。 HttpClientは、1回インスタンス化し、アプリケーションの有効期間全体に再利用することを目的としています。 すべての要求に対して HttpClient クラスをインスタンス化すると、大量の読み込みで使用可能なソケットの数が枯渇します。 これにより、SocketException エラーが発生します。 間違った使い方をしていても普段はあまり問題は起きませんが、高負荷時に突然ダウンすることが起こりえます。 Azure App Service で問題になりやすい理由 間違った実装のアプリをAzure App Serviceで運用している場合、特に問題になりやすいです。どうし
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く