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

德文·泰格

我正在使用一个没有源的库,因此无法使用async关键字修饰它,无法执行类似awaita的操作Task(至少我不知道该怎么做)。它公开了一个方法,该方法返回一个对象(我称其为“答案”)并采用一个整数,并使用一个类型为参数的参数来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
i3arnon

您需要一个同步结构。而且由于这可能要花费几秒钟,所以使用同步(阻塞)将是一种浪费,因此我建议使用异步(例如)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因此不再需要虚拟变量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章