Ответ на мой вопрос кажется неловким, но я думаю, что это может быть полезным для тех, кто находится в подобной ситуации.Также это решение с моими наблюдениями могло бы пролить свет на дальнейшее обсуждение.
Вот что я нашел:
Основано на вызове пользовательского запроса:
Clients.Client(TheConnectionID).Cancel(GUID)
Вы можете выполнить процедуру отмены для каждой конкретной задачи на стороне клиента:
try
{
concurrentCTSDictionary.TryGetValue(GUID, out CancellationTokenSource cts);
cts.Cancel();
}
Фактический обработчик событий, который выполнял задачу и выдал токен:
async Task SomeMethodUserWantCancel([]args, CancellationToken ct)
{
// Option #1 or #2
}
Теперь здесьэто то, что становится немного странным,
Когда я использовал опцию № 1, поток, содержащий исключение-исключение, не работал в том же потоке, где выполнялась фактическая задача, и задача продолжала выполняться, даже если было сгенерировано исключение.Вот почему я отправил вопрос в stackoverflow.
Вариант № 1:
using (var ctr = ct.Register(async () =>
{
ct.ThrowIfCancellationRequested();
}))
{
while (longtaskrunning)
{
await longTask();
}
}
Вариант № 2 сработал и решил мою проблему:
while (longtaskrunning)
{
ct.ThrowIfCancellationRequested();
await longTask();
}