首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用IAsyncResult

如何使用IAsyncResult
EN

Stack Overflow用户
提问于 2015-08-12 23:48:41
回答 2查看 925关注 0票数 0

我有一个具有以下签名的方法,它属于一个类。

代码语言:javascript
复制
public virtual IAsyncResult DoSomething(CustomOptions options);

我正在尝试弄清楚如何准确地调用回调。我在任何地方都找不到要给出回调方法的事件。

EN

回答 2

Stack Overflow用户

发布于 2015-08-12 23:56:35

这几乎是从MSDN复制过来的:

代码语言:javascript
复制
    // 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方法,该方法接受一段代码(另一个任务)作为回调,该回调将在任务完成后运行。

票数 1
EN

Stack Overflow用户

发布于 2015-08-13 02:21:49

要了解如何使用IAsyncResult,您应该了解它的用途。它通常用于异步调用。最常见的用法是委托异步调用。在这种情况下,IAsyncResult是一个回执,它被用作“信息载体”,并提供一个同步对象,以便在异步操作完成时中止线程。

通常,您不需要创建IAsyncResult。IAsyncResult只是实现回执功能的一种方式。你可能不会把事情搞得这么复杂。只需传输一个简单的结构来携带所需的信息。

像这样:

代码语言:javascript
复制
/// <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框架已经将其纳入其中。所以根据您的需求来决定收据的内容,不需要使用IAsyncResult。

请参见:

Calling Synchronous Methods Asynchronously

IAsyncResult Interface

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31969978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档