如何使用IAsyncResult

时间:2015-08-12 15:48:41

标签: asynchronous iasyncresult

我有一个方法,其中包含属于某个类的以下签名。

public virtual IAsyncResult DoSomething(CustomOptions options);

我试图弄清楚我究竟是如何调用回调的。我无法找到提供回调方法的事件。

2 个答案:

答案 0 :(得分: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);

如果方法是你自己的,你可能想尝试返回一个Task,它将有一个ContinueWith方法,它接受一个代码块(Another Task)作为回调,它将在Task完成后运行。 / p>

答案 1 :(得分: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。

请参阅:

Calling Synchronous Methods Asynchronously

IAsyncResult Interface