同步接受 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

同步接受 Action 参数的调用方法

您需要

一个同步构造。由于这可能需要几秒钟,因此使用同步(阻塞)一个会是一种浪费,所以我建议使用异步的,例如 TaskCompletionSource

var tcs = new TaskCompletionSource<object>();
remoteLibrary.remoteMethod(42, x => 
{
    tcs.SetResult(x.Value);
});
var answer = await tcs.Task;
// use answer

TaskCompletionSource公开了一个任务,您可以await该任务在调用SetResult(或SetCanceledSetException)之前无法完成。完成后,您将获得在SetResult中设置的结果,因此您不再需要虚拟变量。