在返回之前等待操作被调用

本文关键字:操作 调用 等待 返回 | 更新日期: 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。