スポンサーリンク

Delegate.BeginInvoke 呼び出しの.NET Coreへのマイグレーション

I recently worked with a couple customers migrating applications to .NET Core that had to make code changes to workaround BeginInvoke and EndInvoke methods on delegates not being supported on .NET Core. In this post, we’ll look at why these APIs aren’t implemented for .NET Core,

情報源: Migrating Delegate.BeginInvoke Calls for .NET Core | .NET Blog

概略

.NET CoreではdelegateのBeginInvoke、EndInvoke両メソッドの組合せによる非同期処理に対応していません。これはもともとCLRが用意した非同期処理の方法ではなく、C#コンパイラにより実現されており、かつ、それが.NET Coreで実装されない.NET Frameworkのリモーティングに依存しているためです。

しかし一つ問題があり、.NET Frameworkから.NET Coreへの移植の際にその使用が推奨されている、.NET Coreへの非互換APIを検出する.NET API Portability Analyzerでは、このコードを検出する事が出来ません。これは、この機能が先に説明したようにCLR機能やクラスライブラリとして実装されているわけではないためです。

そして、この記事ではdelegateのBeginInvoke、EndInvoke両メソッドの組合せによる非同期処理をTaskベースの非同期処理に置き換える方法について説明しています。

私的な追記

デリゲートのBeginInvoke、EndInvoke両メソッドの組合せによる非同期処理は、Threadクラスを使用した非同期処理に比べて、記述がしやすく、作成したスレッドで発生した例外を取得する手段があったので、.NET Framework 2.0ぐらいまでのコードではよく使われていたと思います。特にWinFormsなどのアプリケーションで、重いI/O処理などに使用されていることが多かったように思いますので、古いコードの移植の際にはツールで見つからないこともあり、注意が必要でしょう。

タイトルとURLをコピーしました