Как правильно отменить задание. Когда вы бросите первое исключение?C#

Место общения программистов C#
Ответить
Anonymous
 Как правильно отменить задание. Когда вы бросите первое исключение?

Сообщение Anonymous »

У меня есть несколько задач, которые принимают токен отмены и называют MopifcancellationRequested соответственно. Эти задачи будут выполняться одновременно с использованием task.whenall . Я хочу, чтобы все задачи были отменены, когда какие -либо задачи бросают исключение. Я достиг этого, используя Select и продолжить :

Код: Выделить всё

var cts = new CancellationTokenSource();

try
{
var tasks = new Task[] { DoSomethingAsync(cts.Token), ... } // multiple tasks here
.Select(task => task.ContinueWith(task =>
{
if (task.IsFaulted)
{
cts.Cancel();
}
}));

await Task.WhenAll(tasks).ConfigureAwait(false);
}
catch (SpecificException)
{
// Why is this block never reached?
}
< /code>

Я не уверен, что это лучший способ сделать это, кажется, у него есть некоторые проблемы. Похоже, что исключение будет пойман внутри, код после того, как все всегда достигается. Я не хочу, чтобы код после того, как все было достигнуто 
, когда произошло исключение, я бы предпочел, чтобы исключение было брошено, чтобы я мог поймать его вручную на другом уровне стека вызовов. Как лучше всего это добиться? Если возможно, я бы хотел, чтобы стек вызовов оставался нетронутым. Если произойдет несколько исключений, было бы лучше всего, если бы только первое исключение повторно, нет агрегированной экспрессии < /code>. < /P>



На соответствующем примечании я попытался передавать токен отмены, чтобы продолжить как SO: task.continuewith (rambda, cts.token) . Однако, когда возникает исключение в любой задаче, это в конечном итоге вызовет taskcancelexexception вместо исключения, которое мне интересно. Я подумал, что должен передать токен отмены, чтобы продолжить , потому что это отменит продолжение < /код> сам, что я не думаю, что я хочу.

Подробнее здесь: https://stackoverflow.com/questions/423 ... -exception
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»