5

Visual Studio Async CTP (バージョン 3) を使用して、このフレームワークを使用して既存のコードを「ラップ」する方法を理解するのに苦労しています。

例えば

OpenPop.NET ライブラリを使用して、pop3 サーバーとの接続を確立し、有効なユーザー名とパスワードを持っていることを確認しようとしています。

したがって、このようなコードがあるとしましょう。

    public bool ConnectSync()
    {
        bool success = true;
        Pop3Client client = new Pop3Client();

        try
        {
            client.Connect("mail.server.com", 110, false);
            client.Authenticate("username", "password");
        }
        catch
        {
            success = false;
        }
        return success;
    }

そして今、私はそれを非同期にしたいと思います。私が読んでいてつなぎ合わせたものからの私の理解は、

    public async Task<bool> ConnectAsync()
    {

    }

これはブール値 (?) を返すタスクになるため、これは正しい署名であると思いますが、TaskEx.Run() メソッドを使用する必要があると思いますか? しかし、それは私が理解できる限りです。誰かが正しい方向を指すことができますか?

4

2 に答える 2

3

はい、これまでのところあなたは正しいです。

メソッドを変換する簡単な方法は、メソッドをラップするだけでTaskEx.Run、メソッドがスレッド プール スレッドで実行され、UI スレッドがブロックされないようにすることです。

public Task<bool> ConnectAsync()
{
    return TaskEx.Run( () =>
        {
            bool success = true;
            Pop3Client client = new Pop3Client();

            try
            {
                client.Connect("mail.server.com", 110, false);
                client.Authenticate("username", "password");
            }
            catch
            {
                success = false;
            }
            return success;
        }
    );
}
于 2012-01-04T10:10:30.197 に答える
3

基本的に、非同期 CTP から最大限の利益を得るには、非同期呼び出しで実際に行うことができます。非同期 CTP をまったく使用せずに、同期 メソッドをタスクに非常に簡単にラップできます。ConnectSync

// Note: not an async method in itself
public Task<bool> ConnectAsync()
{
    return Task.Factory.StartNew<bool>(ConnectSync);
}

(ここで型引数を指定する必要がない可能性もあります。メソッド グループ変換を使用した型推論の正確な規則を思い出すことはできません。)

ただし、接続中にスレッドが拘束されます。それで問題がなければ、少なくともasync メソッドから呼び出して適切に待機できるメソッドができあがります。他に何もない場合、これにより、アプリケーションの残りの部分を非同期を使用して上向きに構築できます。POP3 コードが非同期をサポートしている場合はConnectAsync、非同期メソッドに書き直すことができます。

于 2012-01-04T10:11:00.647 に答える