На самом деле есть два ответа на этот вопрос.
Возможная реализация
Ваша настройка, для начала, несовершенна.
// #Server#
// Server Set-Up
private bool forceStop;
public void Stop()
{
forceStop = true;
}
Предположим, у нас есть два клиентаоба начинают новый расчет.Теперь один клиент хочет прервать.Что происходит?
Решение состоит в том, чтобы структурировать его таким образом, чтобы вычисление представляло собой отдельный объект бизнес-логики, экземпляр которого создается на TimeConsumingOperation()
и предоставляется клиенту некоторыми средствами, обычно путем возврата некоторого видаID.
Когда клиент теперь хочет прервать, он вызывает Stop(calcualtionID)
.Логика на стороне сервера теперь направляет вызов к реализации и запускает любой механизм прерывания, с C # это, вероятно, CancellationToken
.
Третий вызов потребуется для запроса окончательных результатов с сервера.закончить, как только расчет закончен.Обратите внимание, что мы все еще работаем с TSimpleServer
, и причина в том, что он работает, потому что мы избегаем блокировки вызовов с помощью API.
Неблокирующий сервер
Да, реализации пока нетC #.Поскольку Thrift является Open Source, это, вероятно, просто означает, что до сих пор никто не сталкивался с этим вариантом использования и хотел тратить время на реализацию.Это не означает, что такой вариант использования может не существовать.
Существуют
- Многопоточные и Threadpool серверы
Task.Run(() => { your code })
, что может помочь решить ваш вариант использования.Кроме того, при использовании с ASP.NET нет необходимости в неблокирующем сервере, поскольку среда выполнения уже обеспечивает достаточную поддержку для нескольких соединений.
Итог
Существуют определенные способы обойти это ограничениеВы испытали.Еще одна альтернатива может заключаться в том, чтобы стать участником , перенеся одну из существующих (например, Java) неблокирующих реализаций на NetStd (предпочтительно, поскольку C # и NetCore перейдут в состояние "устарело" сследующий выпуск и оба будут заменены NetStd)