【发布时间】:2014-11-22 22:46:57
【问题描述】:
我需要做的是等待特定方法被执行。
class MyClass
{
public void TheMethodToAwait()
{
// Do something to signal that the method was invoked
}
public AnAwaitableObject TheMethodToAwaitWasExecuted()
{
// Need help in creating the awaitable object
}
}
如您所见,我想要一个返回等待对象的方法,以便其他类可以执行以下操作:
await InstanceOfMyClass.TheMethodToAwaitWasExecuted();
我知道创建自定义等待对象的基础知识,但我一直在努力解决这个问题,因为我从未在实践中这样做过。
像往常一样,非常感谢任何帮助,谢谢
附加信息
该方法需要多次等待。实际上它是游戏主循环中的更新。我的异步方法做了一些必须与循环同步的工作。如果游戏以 60 FPS 运行,那么异步方法需要每秒完成 60 次工作。希望现在这更有意义。
我最后是怎么做到的
为了完整起见,我也会发布我的实现:
public class AwaitableEvent<TResult>
{
private ConcurrentQueue<EventAwaiter<TResult>> _awaiterQueue;
public AwaitableEvent()
{
_awaiterQueue = new ConcurrentQueue<EventAwaiter<TResult>>();
}
public EventAwaiter<TResult> GetAwaiter()
{
var awaiter = new EventAwaiter<TResult>();
_awaiterQueue.Enqueue(awaiter);
return awaiter;
}
public void Notify(TResult result)
{
var awaiterCount = _awaiterQueue.Count;
while (awaiterCount-- > 0)
{
EventAwaiter<TResult> awaiter;
if (_awaiterQueue.TryDequeue(out awaiter))
{
awaiter.Notify(result);
}
}
}
}
public class EventAwaiter<TResult> : INotifyCompletion
{
private Action _continuation;
private TResult _result;
public bool IsCompleted
{
get { return false; }
}
public EventAwaiter()
{
}
public void Notify(TResult result)
{
_result = result;
_continuation();
}
public void OnCompleted(Action continuation)
{
_continuation = continuation;
}
public TResult GetResult()
{
return _result;
}
}
【问题讨论】:
-
为什么不想返回
Task?如果您希望调用者await该对象,则很少有理由返回任何其他内容。几乎任何时候你看到有人创建一个自定义的等待对象,这纯粹是作为一种学术练习,以更好地了解幕后发生的事情,而不是出于任何实际目的。 -
@Servy 我返回任务没有问题,只是我不知道如何实现我想要的。如果您可以使用 Task 做到这一点,请使用代码示例添加答案。
-
@Dan Briant 您介意用代码示例添加答案吗?
-
@dan 不知道你的方法应该做什么,我怎么可能可能告诉你怎么做?几乎可以肯定,您应该在这里返回
Task。如何让Task返回将高度 取决于此方法的具体用途。创建任务的方法有很多,它们会根据执行的底层操作以及您使用哪些其他工具来创建固有的异步性而有所不同。
标签: c# async-await