我正在使用一个没有源的库,因此无法使用async关键字修饰它,无法执行类似await
a的操作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
您需要一个同步结构。而且由于这可能要花费几秒钟,所以使用同步(阻塞)将是一种浪费,因此我建议使用异步(例如)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
因此不再需要虚拟变量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句