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

问题描述 投票:0回答:2

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

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进行了一些简单的内置操作?

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

c# .net asynchronous events .net-standard
2个回答
1
投票

我希望应用程序开发人员能够以一种典型的一劳永逸的方式来调用此方法,但是在方法完成时再使用带有返回数据的事件。

我认为您可能使事情复杂化了。我认为您可以忽略此要求,而仅由消费者来处理。

以最简单的形式,假设消费者想要启动此方法,在等待时执行其他操作,然后稍后返回结果。他们可以做这样的事情:

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(但这有一些警告,例如异常的处理方式)。无论哪种方式,作为该库的作者,您都不必担心。


0
投票

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

ContinueWith
© www.soinside.com 2019 - 2024. All rights reserved.