C#非同期Methodは#defineで

昨年からの案件で追われまくり、なかなか記述できないことが多く誰のためにもならない気配ですが、気を取り直してぼちぼち再開です。 巷で流行りの非同期メソッドについて思うがままに私事のTipを残しておきます。自分のためにも。 今更ながら.Net4.0と.Net4.5で大きな違いを述べるのもお恥ずかしい限りでありますが非同期メッソッドのの構文が大きく変化したことです。  非同期の歴史を語ったりしませんが、async await を付ける付けない。運用環境の.Netバージョンによって手前味噌のライブラリーが思わぬ副作用が出ることを経験し、今更ながらプリプロセッサのありがたみが身に沁みます。往年の開発者たちはC++の時代にライブラリーの使い分けや環境の違いを吸収するためにプリプロセッサをフルに活用していたあの時代のテクニックです。  特になにか新しいことをするのではなく、しっかり#define でシンボルを定義若しくは定義解除(#undef)して.Net4.0と.Net4.5のコンパイルを正確に記述するだけです。基本的にはProjectの条件付きシンボルをコンパイル前に定義する。

#if DotNet20
        //APM IAsync Callback
        public void CallBackRead()
        {
            _ReadCallbake = new AsyncCallback(OnRead);
            _shIo.BeginRead(_Buff, 0, BuffSIZE, _ReadCallbake, null);
        }
#endif
#if DotNet40
        public Task<string> AsyncRead()
        {
            var tcs = new TaskCompletionSource<string>();
            byte[] bff = new byte[ BuffSIZE];

            var rLength = Task<int>.Factory.FromAsync(_shIo.BeginRead, _shIo.EndRead,
                bff,0, BuffSIZE,null);
            
            var str =  Encoding.ASCII.GetString(bff, 0, rLength.Result);
            tcs.SetResult(str);
            return tcs.Task;
        }
#endif
#if DotNet45
        public async Task<string> AsyncRead()
        {
            byte[] bff = new byte[ BuffSIZE];
            int length = await _shIo.ReadAsync(bff, 0,  BuffSIZE);

            var str = Encoding.ASCII.GetString(bff, 0, length);
#if DEBUG
            Console.WriteLine("Debug: "+str);
#endif
            return str;

        }
#endif