Я бы рассмотрел альтернативный вариант - создать клиентский интерфейс WCF с асинхронными методами. Это позволит вам выполнять все вызовы службы WCF асинхронно (с точки зрения клиентского приложения), что позволит вам поддерживать отмену, обработку ошибок, возврат результата и т. Д.
Преимущество заключается в том, что вы не будете блокировать поток в пуле рабочих потоков (как это сделает System.Threading.Tasks), и вам не нужно будет пытаться выяснить, как отменить синхронный вызов WCF. в вашей рабочей ветке.
Есть ли причина, по которой вы должны сделать синхронный вызов WCF?