【发布时间】:2021-05-11 09:31:54
【问题描述】:
假设我有以下订阅事件的方法。事件发生时调用回调。我想阻止我的方法返回,直到调用回调,或者经过 10 秒。
public async Task<string> GetImportantString()
{
string importantResult = null;
await SubscribeToEvent("some event", async (message) =>
{
importantResult = message; // When "some event" happens, callback is called and we can set importantResult
}
return message; // Only return when the callback is called, or 10 seconds have passed
}
SubscribeToEvent()的签名如下:
public Task SubscribeToEvent(string event, Action<string> handler);
我使用方法GetImportantString()的方式如下:
public void SomeMethod()
{
// Do some things
var importantString = await GetImportantString();
// Do other things
}
问题是在调用回调之前我找不到不从GetImportantString() 返回的方法。理想情况下,我想等到回调调用最多 10 秒,如果在 10 秒内未调用回调,则返回错误。如何在调用回调之前暂停GetImportantString() 的执行?
【问题讨论】:
-
GetImportantString中异步的全部意义在于不阻塞调用者线程。通常,如果还等待,则仅在SubscribeToEvent返回后继续执行 -
SubscribeToEvent方法的更好签名是:public Task<string> SubscribeToEvent(string event, Func<string, Task<string>> handler);。您当前的签名不允许与异步委托进行适当的合作。您示例中的async (message) =>lambda 是async void,即something to avoid。 -
顺便说一句,
async (message) =>lambda 可能会在 Visual Studio 中生成警告,关于缺少await运算符的async方法。
标签: c# async-await