6

Task パターンを使用して WCF メソッドを非同期的に呼び出すメソッドを含むクラスを持つコードをいくつか維持しています。

コードは実質的に次のようになります。

public class Manager : IDisposable
{
    public void DoSomething()
    {
        Task<bool> task;

        using (var client = new WcfClient())
        {
            task = client.ReallyDoSomethingAsync(123);
        }
    }
}

マネージャー自体は、DoSomething への呼び出しを using(Manager) ブロック内にラップする別のコードの別の場所で使用されます。

私の質問は、WCF 呼び出しはどうなるかということです。それは起こりますか?それは放棄しますか?

Task<T>より一般的には、これはパターンを使用した非同期呼び出しにも当てはまりますか? 非同期呼び出しが終了する前に、所有しているクラスがスコープ外になるとどうなりますか?

4

3 に答える 3

1

基本的に、それぞれTaskに 2 つの側面があります。プロデューサー ( のようなものTaskCompletionSource) とコンシューマー (Taskそれ自体) です。

コンシューマー側への参照がない場合でも、プロデューサー側への参照は存在します。これが意味することは、 を放棄しTaskても何も起こらないということです。非同期呼び出しは通常どおり続行されます。そして、それが完了して初めて、Taskガベージ コレクションの対象になります。

非同期操作をキャンセルしたい場合は、プロデューサに停止するよう明示的に指示する必要があります。これは通常、CancellationToken.

于 2013-09-25T12:37:56.557 に答える