TaskCompletionSource 重新启动 API 调用

TaskCompletionSource restarts api call

提问人:AverageProgrammer 提问时间:11/23/2022 更新时间:11/23/2022 访问量:140

问:

因此,我有一个公开两个端点的 ASP .NET 应用程序。一个用于启动连续任务,另一个用于超时
我的控制器看起来像这样

public class SomeController: ControllerBase
{
    private readonly ISomeService _service;
           
    public SomeController(ISomeService service)
    {
        _service= service;
    }
    
    [HttpPost, Route("service/stop")]
    public ActionResult StopService()
    {
        _service.StopService();
        return Ok();
    }
    
    [HttpPost, Route("service/start")]
    public async Task<ActionResult> StartService()
    {
        int result = await _service.Start();
    
        return Ok(new {Result = result});
    }
}   

服务看起来像
public class SomeService : ISomeService
{
    private static TaskCompletionSource<bool> tcs;

    private readonly IInternalService _internalService;

    public SomeService(IInternalService internalService) => _internalService = internalService;

    public void StopService()
    {
        tcs.TrySetException(new TimeoutException("Operation timed out") );
    }

    public Task<int> StartService()
    {
        tcs = new TaskCompletionSource<bool>();

        EventHandler<EventArguments> eventHandler = (sender, e) => EventHandler(sender, e, parameter1, parameter2);
        try
        {
            _internalService.Event += eventHandler;

            while (!(eventResult = (await tcs.Task))) ;
        }
        catch (Exception ex)
        {
            _logger.LogError($"Event failed because of {ex.Message}");
            throw;
        }
        finally
        {
            _internalService.Event -= eventHandler;
        }
    }

    private void EventHandler(object sender, EventArguments e, string parameter1, bool parameter2)
    {
            if (some condition)
            {
                tcs.TrySetException(new Exception("Event handling failed because condition was not met");
                return;
            }

            try
            {
                _internalService.SomeOperation(parameter2);
                tcs.SetResult(true);
            }
            catch (Exception ex)
            {
                tcs.TrySetException(ex);
                return;
            }
    }
}

当事件处理程序内部异常时,将任务完成源设置为状态,出现异常,一切正常。但是当我启动服务并在一段时间后使用 StopService API 调用设置超时异常时,异常在 StartService 尝试中被捕获......catch 之后,API 会自动触发对 StartService 方法的另一次调用。

asp.net .NET 事件 TaskCompletionSource

评论


答: 暂无答案