提问人:AverageProgrammer 提问时间:11/23/2022 更新时间:11/23/2022 访问量:140
TaskCompletionSource 重新启动 API 调用
TaskCompletionSource restarts api call
问:
因此,我有一个公开两个端点的 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 方法的另一次调用。
答: 暂无答案
评论