假设我使用以下异步方法创建了一个库:
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
方法?调用者可以通过将延续链接到任务来创建“事件”:
ContinueWith