読者です 読者をやめる 読者になる 読者になる

ぱらつり記

No description

C#の非同期処理

現在開発中のOnedrawHelperで多用している非同期処理についての備忘録です。

少し前はマルチスレッド処理を行うために、System.Threading.Tasks.Task.Factory.StartNew()を利用していましたが、C# 5.0から導入されたasync, awaitキーワードを取り入れることに。

awaitで非同期メソッドを待機、asyncでそのメソッドにawaitが利用されているという感じにイメージをつかんで使ってみました。

が、とんでもない使い方をしている部分がありました。

using System;
using System.Threading.Tasks;
Task<bool> Foo()
{
    return Task.Run(async () =>
    {
        bool result = await DoSomethingAsync();
        return result;
    });
}

外側のメソッド自体はViewModelにおけるCommandの実行メソッドにあたるものです。
が、Commandの実行メソッドにasyncキーワードっていいのかな的な観念にとらわれて上のようなコードを書いていました。
async自体はあくまで非同期処理を明示するものにすぎないので、素直に書き直すべきですね。

2014/11/23追記
ちとくさんのコメントによる指摘を勘案してコードを書き換えました。
例がガバガバなのはなんとかしたい

DoSomethingAsync が非同期メソッドである以上 await を書く必要もないと思います。
Task Foo()
{
return DoSomethingAsync();
}

using System;
using System.Threading.Tasks;
// 非同期メソッドで処理が終わる場合
Task<bool> Foo()
{
    return DoSomethingAsync();
}

// 非同期メソッドの後に処理がある場合
async Task<string> Bar()
{
    var result = await DoSomethingAsync();
    return result ? "true" : "false";
}