3

IAwaitable クラス (スレッドをブロックせずに非同期呼び出しを実装するもの) を実装したいと思っていました。

最新バージョンの AsyncCTP をインストールしましたが、コンパイラは IsCompleted() メンバーが必要だと言っています。さて、CTP のプレビューが少し進みました (プレビューのようにわかります)。

質問: AsyncCTP 言語拡張機能が現在期待しているインターフェイスは何ですか?

質問:このすべてにおいて、ラムダ/デリゲートを介して「IAwaitable」にシグナルを送ることができると仮定していますか? これは可能ですか?EndAwait を呼び出しますか? インテリセンスは、EndAwait を呼び出して結果を取得することを提案しているため、正しく聞こえません。何か案は?

これまでに見つけた例はすべて、AsyncCTP ライブラリが既に実装している次のような機能に関するものです。

  await new WebClient().DownloadStringTaskAsync(uri).ConfigureAwait(false);

101 AsyncSamplesCSから

バックグラウンド:

Jon Skeets のページ (再び) で、この例を見ています。

using System;

class Test
{
    static async void Main()
    {
        await new Awaitable();
    }
}

class Awaitable
{
    public Awaiter GetAwaiter()
    {
        return new Awaiter();
    }
}

class Awaiter
{
    public bool BeginAwait(Action continuation)
    {
        return false;
    }

    public int EndAwait()
    {
        return 1;
    }
}
4

1 に答える 1

5

SP1の更新では、次のものが必要です。

  • 以下のすべてを含む何か(あなたの例で は)を返すいくつかのGetAwaiter()メソッド(おそらく拡張メソッドである必要はありません)。Awaiter
    • bool IsCompletedプロパティ(get
    • Avoid OnCompleted(Action callback)
    • GetResult()を返すメソッド、または待機中のvoid操作の望ましい結果

しかし、私はあなたが見ることをお勧めしますTaskCompletionSource<T>-私はこれを見ました、そしてそれは私の素朴な実装(ここでは;廃止されました)を上回りました。voidまた、のようなものを使用して、タスクに使用することもできます(また、が型指定されていないTaskCompletionSource<bool>という事実を利用します)。Task<bool>Task

于 2011-07-18T11:16:13.967 に答える