SignalR просто завершает одну долгосрочную задачу среди многих в конкретном клиенте - PullRequest
0 голосов
/ 14 марта 2019

Я искал правильную методологию для достижения этого сценария без какой-либо удачи.

Это касается нескольких долгосрочных задач для конкретного клиента, скажем, было три задачи, выполняющихся в одном клиенте асинхронно в то времяt0, t1 и t2.

Clients.Client(TheConnectionID).Task1(GUID1)   //at t0
Clients.Client(TheConnectionID).Task1(GUID2)   //at t1
Clients.Client(TheConnectionID).Task1(GUID3)   //at t2

Позже, с сервера (Hub) был отправлен запрос пользователя в Task, запущенный с t1.Сервер знает, что GUID, отправленный для Task1, запущен в момент времени t1.

Clients.Client(TheConnectionID).Cancel(GUID2)  //To cancel task started at t1

Я попытался связать GUID с CancellationToken и как-то бросить операцию отмененного исключения безуспешно.Каким-то образом поток, в котором генерируется исключение, кажется не тем потоком, в котором выполняется задача t1 ..

Пожалуйста, кто-нибудь пролил мне свет на то, что я делаю неправильно, или если это невозможно с помощью методов вызова сигнализатора на стороне клиента.

1 Ответ

0 голосов
/ 15 марта 2019

Ответ на мой вопрос кажется неловким, но я думаю, что это может быть полезным для тех, кто находится в подобной ситуации.Также это решение с моими наблюдениями могло бы пролить свет на дальнейшее обсуждение.

Вот что я нашел:

Основано на вызове пользовательского запроса:

 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();
}
...