AsyncOperationManager.CreateOperation(Object) メソッド

定義

特定の非同期操作の存続期間を追跡するために使用する AsyncOperation を返します。

public:
 static System::ComponentModel::AsyncOperation ^ CreateOperation(System::Object ^ userSuppliedState);
public static System.ComponentModel.AsyncOperation CreateOperation (object userSuppliedState);
public static System.ComponentModel.AsyncOperation CreateOperation (object? userSuppliedState);
static member CreateOperation : obj -> System.ComponentModel.AsyncOperation
Public Shared Function CreateOperation (userSuppliedState As Object) As AsyncOperation

パラメーター

userSuppliedState
Object

クライアント状態の一部 (タスク ID など) を特定の非同期操作に関連付けるために使用されるオブジェクト。

戻り値

非同期メソッド呼び出しの存続期間を追跡するために使用できる AsyncOperation

次のコード例では、 メソッドを CreateOperation 使用して、非同期操作の期間を追跡するための を System.ComponentModel.AsyncOperation 作成する方法を示します。 このコード例は、AsyncOperationManager クラスのために提供されている大規模な例の一部です。

// This method starts an asynchronous calculation. 
// First, it checks the supplied task ID for uniqueness.
// If taskId is unique, it creates a new WorkerEventHandler 
// and calls its BeginInvoke method to start the calculation.
public virtual void CalculatePrimeAsync(
    int numberToTest,
    object taskId)
{
    // Create an AsyncOperation for taskId.
    AsyncOperation asyncOp =
        AsyncOperationManager.CreateOperation(taskId);

    // Multiple threads will access the task dictionary,
    // so it must be locked to serialize access.
    lock (userStateToLifetime.SyncRoot)
    {
        if (userStateToLifetime.Contains(taskId))
        {
            throw new ArgumentException(
                "Task ID parameter must be unique", 
                "taskId");
        }

        userStateToLifetime[taskId] = asyncOp;
    }

    // Start the asynchronous operation.
    WorkerEventHandler workerDelegate = new WorkerEventHandler(CalculateWorker);
    workerDelegate.BeginInvoke(
        numberToTest,
        asyncOp,
        null,
        null);
}
' This method starts an asynchronous calculation. 
' First, it checks the supplied task ID for uniqueness.
' If taskId is unique, it creates a new WorkerEventHandler 
' and calls its BeginInvoke method to start the calculation.
Public Overridable Sub CalculatePrimeAsync( _
    ByVal numberToTest As Integer, _
    ByVal taskId As Object)

    ' Create an AsyncOperation for taskId.
    Dim asyncOp As AsyncOperation = _
        AsyncOperationManager.CreateOperation(taskId)

    ' Multiple threads will access the task dictionary,
    ' so it must be locked to serialize access.
    SyncLock userStateToLifetime.SyncRoot
        If userStateToLifetime.Contains(taskId) Then
            Throw New ArgumentException( _
                "Task ID parameter must be unique", _
                "taskId")
        End If

        userStateToLifetime(taskId) = asyncOp
    End SyncLock

    ' Start the asynchronous operation.
    Dim workerDelegate As New WorkerEventHandler( _
        AddressOf CalculateWorker)

    workerDelegate.BeginInvoke( _
        numberToTest, _
        asyncOp, _
        Nothing, _
        Nothing)

End Sub

注釈

メソッドは CreateOperationSystem.ComponentModel.AsyncOperation 特定の非同期操作の期間を追跡し、操作が完了したときにアプリケーション モデルに警告するために使用できる を返します。 また、操作を終了せずに進行状況の更新と増分結果を投稿するためにも使用できます。 は System.ComponentModel.AsyncOperation 、これらの呼び出しをアプリケーション モデルの適切なスレッドまたはコンテキストに正しくマーシャリングします。

イベント ベースの非同期パターンをサポートするクラスを実装する場合は、MethodNameAsync メソッドが呼び出されるたびに クラスを呼び出CreateOperationす必要があります。 メソッドの呼び出しを行うクライアント アプリケーションでは、 パラメーターを userSuppliedState 使用して各呼び出しを一意に識別し、非同期操作の実行中に発生したイベントを区別できます。

注意事項

クライアント コードでは、 パラメーターに一意の値を指定する userSuppliedState 必要があります。 一意でないタスク ID を使用すると、実装で進行状況やその他のイベントが誤って報告される可能性があります。 コードでは、一意でないタスク ID をチェックし、検出された場合は をスローするSystem.ArgumentException必要があります。

コードは、 によってCreateOperation返されるすべてのをSystem.ComponentModel.AsyncOperation追跡し、対応する基になる非同期操作の オブジェクトを使用して更新をポストし、操作を終了する必要があります。 この追跡は、デリゲート間で パラメーターとして を System.ComponentModel.AsyncOperation 渡すのと同じくらい簡単です。 より高度な設計では、クラスはオブジェクトのコレクションを維持し、タスクの System.ComponentModel.AsyncOperation 開始時にオブジェクトを追加し、タスクが完了または取り消されたときにオブジェクトを削除できます。 この方法では、一意userSuppliedStateのパラメーター値をチェックできます。これは、複数の同時呼び出しをサポートするクラスを操作するときに使用する必要があるメソッドです。

非同期クラスの実装の詳細については、「 イベント ベースの非同期パターンの実装」を参照してください。

適用対象

こちらもご覧ください