C# 我如何才能等待,直到我收到一个回调/通知,而不是忙着等待?

C# 我如何才能等待,直到我收到一个回调/通知,而不是忙着等待?,c#,async-await,event-driven,C#,Async Await,Event Driven,我知道我如何才能等待库代码等待网络请求或其他长时间运行的操作完成,但我如何等待自己的长时间运行操作而不忙着等待 这是繁忙等待解决方案。如何使其成为事件驱动的 公共异步任务ClickSend(){ //等待,直到有人呼叫DataReceived() while(_Block==null){ 等待任务; } 返回块; } //外部的东西调用这个函数。 //调用后,ClickSend应完成此数据。 接收到公共无效数据(数据块数据块){ _块=数据块; } 数据块_Block=null; (这个问题

我知道我如何才能
等待库代码等待网络请求或其他长时间运行的操作完成,但我如何
等待自己的长时间运行操作而不忙着等待


这是繁忙等待解决方案。如何使其成为事件驱动的

公共异步任务ClickSend(){
//等待,直到有人呼叫DataReceived()
while(_Block==null){
等待任务;
}
返回块;
}
//外部的东西调用这个函数。
//调用后,ClickSend应完成此数据。
接收到公共无效数据(数据块数据块){
_块=数据块;
}
数据块_Block=null;
(这个问题与询问如何在事件处理程序上等待完全不同,但非常类似。)

一个“未来”是返回值的占位符,它有一个相关的“承诺”,该承诺被实现以传递最终返回值

在C#中,它们有不同的名称:未来是一项任务,也是一种挑战

您可以创建一个承诺,等待它,然后在收到回电时兑现它:

TaskCompletionSource\u Promise=new TaskCompletionSource();
公共异步任务ClickSend(){
数据块块=等待_Promise.Task;
返回块;
}
接收到公共无效数据(数据块数据块){
_Promise.TrySetResult(数据块);
}

.

@PeterDuniho:没有一个答案建议使用
TaskCompletionSource
。我同意这两个问题似乎是在问同一个问题,但目的却大不相同。我不关心
事件
关键字的异步行为,他们也不关心TaskCompletionSource。答案与“C#中的承诺是什么”非常相似,你是对的,但是如果你不知道你在寻找什么(承诺),并且问题是用另一种语言表达的,那么很难找到这个问题。我之所以提出这个问题,是因为它与上下文无关,所以它更广泛地有用。(我看不到你所指的任何“这可能是重复的”链接——只是你的评论。)你可以看到这篇文章的修订历史,它显示了我错误地用于重复目标的文章,然后是我刚刚添加的正确的文章。不幸的是,我没有注意到第一个链接的错误,因为那也是我修复它的正确时机。