0

クラスに属する次のシグネチャを持つメソッドがあります。

public virtual IAsyncResult DoSomething(CustomOptions options);

コールバックを正確に呼び出す方法を理解しようとしています。コールバック メソッドを指定するイベントがどこにも見つかりません。

4

2 に答える 2

1

これはMSDNからかなりコピーされています:

    // Initiate the asychronous call.
    IAsyncResult result = caller.BeginInvoke(3000, 
        out threadId, null, null);

    Thread.Sleep(0);
    Console.WriteLine("Main thread {0} does some work.",
        Thread.CurrentThread.ManagedThreadId);

    // Wait for the WaitHandle to become signaled.
    result.AsyncWaitHandle.WaitOne();

    // Perform additional processing here. 
    // Call EndInvoke to retrieve the results. 
    string returnValue = caller.EndInvoke(out threadId, result);

メソッドが独自のものである場合は、ContinueWith メソッドを持つ Task を返してみることをお勧めします。このメソッドは、コード ブロック (別のタスク) をコールバックとして受け取り、Task が完了すると実行されます。

于 2015-08-12T15:56:34.810 に答える
0

IAsyncResult の使用方法を理解するには、それがどこで使用されるかを理解する必要があります。通常、非同期呼び出しに使用されます。最も一般的な使用法は、デリゲート非同期呼び出しです。その場合、IAsyncResult はレシートであり、「情報キャリア」として使用され、非同期操作が完了したときにスレッドを中止するために同期オブジェクトを提供します。

通常、IAsyncResult を作成する必要はありません。IAsyncResult は、受信機能を実装する方法にすぎません。それほど複雑にすることはできません。必要な情報を運ぶ単純な構造体を送信するだけです。

お気に入り:

/// <summary>
/// This is a simplified IAsyncResult
/// </summary>
public class Receipt
{
    /// <summary>
    /// Name
    /// </summary>
    public String Name
    {
        get;
        set;
    }

    /// <summary>
    /// Age
    /// </summary>
    public Byte Age
    {
        get;
        set;
    }

    public String OperationResultText
    {
        get;
        set;
    }
}

public class Test
{
    public delegate void Async_OperationCallbackHandler(Receipt r);

    public void MainEntry()
    {
        Thread tmpThread = new Thread(()=>
        {
            Async_Operation("ASDF", 20, Async_Operation_Callback);
        });

        tmpThread.Start();
    }

    public void Async_Operation(String name, Byte age, Async_OperationCallbackHandler callback)
    {
        //Do something with "name" and "age" and get result...
        String result = "OK...";

        Receipt r = new Receipt()
        {
                Age = age,
                Name = name,
                OperationResultText = result
        };

        callback(r);
    }

    internal void Async_Operation_Callback(Receipt r)
    {
        Console.WriteLine("Name = " + r.Name + ", Age = " + r.Age + ", Operation result: " + r.OperationResultText);
    }
}

もちろん、同期は考えていません。しかし、.NET Framework はそれを取り入れています。そのため、必要に応じてレシートの内容を決定します。IAsyncResult を使用する必要はありません。

見る:

同期メソッドの非同期呼び出し

IAsyncResult インターフェイス

于 2015-08-12T18:21:48.787 に答える