繁体   English   中英

是否有内置方法让异步方法在完成时使用返回数据触发事件?

[英]Is there a built-in way to have an async method fire an event with the return data when it completes?

假设我使用以下异步方法创建了一个库:

public async Task<string> MyAsyncMethod()
{
    // Do stuff

    return someString;
}

现在假设我希望应用程序开发人员能够以典型的即发即忘方式调用此方法,然后在方法完成时使用返回数据的事件。

如果我手动执行此操作,它可能看起来像这样:

public async Task<string> MyAsyncMethod()
{
    // Do stuff

    // Fire the success event
    MyEvent?.Invoke(this, new MyEventArgs { Result = someString });

    return someString;
}

...

// Use this callback method to consume the event
public void C_MyAsyncMethodHasCompleted(object sender, MyEventArgs e)
{
    Console.WriteLine("Async method has completed with return value: " + e.Result);
}

这是我的问题:这样做是在浪费时间吗? 即,是否有一些更简单的内置 C# 和/或 .NET 已经做到了这一点?

我主要只是想确保我不会用这种方法重新发明轮子。

我希望应用程序开发人员能够以典型的即发即忘方式调用此方法,然后在方法完成时使用返回数据的事件。

我想你可能把事情复杂化了。 我认为你可以忽略这个要求,让消费者处理它。

在最简单的形式中,假设消费者想要启动这个方法,在等待的同时去做其他事情,然后再回到结果。 他们可以这样做:

var myTask = MyAsyncMethod();
// The method starts running and returns a Task<string> when it hits the first await
// (when it starts waiting for whatever I/O request)

DoOtherStuff();

//Now I'm ready for the result, so I await:
var theString = await myTask;
DoSomethingWith(theString);

同样,他们可以根据需要存储对Task<string>的引用(将其传递给另一个方法等),并且仅在他们准备好使用结果时才await它。

或者他们可以像 Theodor 建议的那样使用ContinueWith (但这有一些警告,比如如何处理异常)。 无论哪种方式,作为该库的作者,您都无需担心。

也许您正在寻找ContinueWith方法? 调用者可以通过将延续链接到任务来创建“事件”:

Task<string> task = MyAsyncMethod();
task.ContinueWith(_ => { /* Event handler */ });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM