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

时间:2014-12-05 17:04:37

标签: c# .net asynchronous task async-await

我正在使用我没有源代码的库,因此我无法使用async关键字对其进行修饰,并执行awaitTask之类的操作(至少我不知道该怎么做)。它公开了一个方法,它返回一个对象(我称之为“回答”)并获取一个整数,以及一个Action类型的参数,我在那里检索该答案。在代码继续之前,我如何等待答案才能填充?

Object answer = null;
remoteLibrary.remoteMethod(42, x => 
{
  answer = x.Value; //This might take a few seconds
});
//I want to do something here with "answer" AFTER it has been populated

1 个答案:

答案 0 :(得分:2)

您需要一个同步构造。由于这可能需要几秒钟,因此使用同步(阻塞)会很浪费,所以我建议使用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中设置的结果,因此您不再需要虚拟变量。