Как обращаться с регистром, где пользователь может нажать кнопку, которая вызывает длительную работу async, несколько раз.Правильно отмените операцию async и снова запустите его
Моя идея была сначала проверена, работает ли операция async, отмените ее и снова запустите.
До сих пор я пытался создать такую функциональность, используя CancellationTokenSource, но он не работает должным образом. Несколько раз выполняется две асинхронные операции, поэтому «старые» асинхронные отписки еще не отменены, когда я запускаю новый, и это смешивает обработку resul.
Любые предложения или примеры, как обращаться с подобным корпусом?
public async void Draw()
{
bool result = false;
if (this.cts == null)
{
this.cts = new CancellationTokenSource();
try
{
result = await this.DrawContent(this.TimePeriod, this.cts.Token);
}
catch (Exception ex)
{}
finally
{
this.cts = null;
}
}
else
{
this.cts.Cancel();
this.cts = new CancellationTokenSource();
try
{
result = await this.DrawContent(this.TimePeriod, this.cts.Token);
}
catch (Exception ex)
{}
finally
{
this.cts = null;
}
}
}
EDIT: В конце концов, я думаю, что это не плохо, что есть две операции асинхронных выполняющиеся в короткий промежуток времени (когда новый обжигали, но старый еще не отменен).
Настоящая проблема заключается в том, как я показываю прогресс для enduser. Как и при завершении старой операции async, он скрывает индикатор прогресса от enduser, но вновь запущенная операция async все еще работает.
EDIT2: Inside DrawContent (...) Я использую ThrowIfCancellationRequested, поэтому отмена выполняемой задачи, похоже, работает нормально.
О выставке прогресса. Когда вызывается Draw(), я устанавливаю индикатор загрузки, и когда этот метод заканчивается, я скрываю индикатор загрузки. Итак, теперь, когда предыдущая операция async отменяется после того, как я запускаю новый, мой индикатор загрузки скрыт. Как мне отслеживать, если еще один асинхронный метод все еще работает, когда заканчивается «старый».
* как * не работает. Не говорите, что * это не работает. Конечно, глотание всех исключений - вообще плохая идея. Не делай этого. Вы никогда не узнаете, что случилось, когда вы это сделаете. – Servy
Обновленный вопрос. – devha
Ну, конечно, старый все еще может бежать. Никогда не ожидайте, пока предыдущая операция не закончится, прежде чем продолжить. Если есть время между запросом на отмену и завершением задачи, на это время будет выполняться два задания. – Servy