同步接受 Action 参数的调用方法
本文关键字:调用 方法 参数 Action 同步 | 更新日期: 2023-09-27 18:33:20
我正在使用一个没有源代码的库,因此我无法使用 async 关键字装饰它并做一些事情,例如await
Task
(至少我不知道该怎么做)。 它公开了一个返回对象(我称之为"answerswer")的方法,并接受一个整数和一个类型为 Action
的参数,我在其中检索该答案。 在代码继续之前,如何等待答案被填充?
Object answer = null;
remoteLibrary.remoteMethod(42, x =>
{
answer = x.Value; //This might take a few seconds
});
//I want to do something here with "answerswer" AFTER it has been populated
您需要
一个同步构造。由于这可能需要几秒钟,因此使用同步(阻塞)一个会是一种浪费,所以我建议使用异步的,例如 TaskCompletionSource
:
var tcs = new TaskCompletionSource<object>();
remoteLibrary.remoteMethod(42, x =>
{
tcs.SetResult(x.Value);
});
var answer = await tcs.Task;
// use answer
该TaskCompletionSource
公开了一个任务,您可以await
该任务在调用SetResult
(或SetCanceled
,SetException
)之前无法完成。完成后,您将获得在SetResult
中设置的结果,因此您不再需要虚拟变量。