在返回之前等待操作被调用
本文关键字:操作 调用 等待 返回 | 更新日期: 2023-09-27 18:09:46
在我的项目中,我使用WebApi2做一些事情并返回一个Id:
Controller.cs
[HttpGet, Route("call")]
public IHttpActionResult MakeCall(string poste, string number)
{
string phoneFrPattern = "^0[1-9][0-9]{8}$";
Match m = Regex.Match(number, phoneFrPattern);
if (m.Success && _isNumeric(poste))
{
_operatorManager.MakeCall(poste, "0" + number, (callId) =>
{
_response.Clear();
_response.Add("callId", callId);
});
return Ok(_response);
}
else
{
return InternalServerError();
}
}
上面的代码工作得很好,除了这个动作不要等待我的action (callId) =>…调用至少一次,我需要从事件返回一个Id。
MakeCall方法:
public void MakeCall(string identifier, string phoneNumber, Action<string> onDialing)
{
if (null == OperatorFactory)
throw new Exception("OperatorManager.OperatorFactory is null");
IOperator @operator = _operators.FirstOrDefault(o => o.Identifier == identifier);
if (null != @operator)
{
@operator.OnDialing += (e) => onDialing(e.CallId);
@operator.IsCalling = true;
@operator.Call(phoneNumber);
}
else
{
@operator = OperatorFactory.Create(identifier);
@operator.OnDialing += (e) => onDialing(e.CallId);
@operator.IsCalling = true;
@operator.Connect();
@operator.Call(phoneNumber);
}
}
您可以使用Task等待,就像这样。
var t = new TaskCompletionSource<int>();
_operatorManager.MakeCall(poste, "0" + number, (callId) =>
{
t.SetResult(callId);
});
t.Task.Wait();
_response.Clear();
_response.Add("callId", t.Task.Result);
return Ok(_response);
TaskCompletionSource提供了各种方法来处理这个问题。其他选项是从MakeCall方法返回一个任务,或者在MakeCall方法中执行相同的技巧并同步返回callId。