Некорректная отмена асинхронной операции - PullRequest
3 голосов
/ 12 марта 2012

В моем приложении Windows Form мне нужно вызвать длительную операцию сторонней математической библиотеки (Accord.NET).Во время вычислений я хочу, чтобы мой GUI реагировал, а также предоставлял пользователю возможность отменить длительную операцию.

Есть ли способ выполнить эту функцию в фоновом потоке и дать пользователю возможность отменитьЭто?Обратите внимание, что долго выполняющаяся функция, которую я хотел бы вызвать, находится во внешней библиотеке и не принимает CancellationToken (в противном случае я мог бы легко использовать, например, ThreadPool 'QueueUserWorkItem).Поэтому я ищу способ отменить операцию без сотрудничества.

Ответы [ 2 ]

3 голосов
/ 12 марта 2012

Я бы сказал, что у вас есть три варианта.

Один, раскрутить вычисление в свой собственный поток.Это будет держать интерфейс отзывчивым.Вместо кнопки отмены просто дайте пользователю знать, что действие, которое он собирается предпринять, нельзя остановить после просмотра.

Два, закрутите вычисление в свой собственный поток, как описано выше;однако делает вид, что отменяет его, просто уменьшая приоритет потоков.Вы можете позволить вычислениям продолжаться, но просто прекратите сообщать о прогрессе в вашем основном потоке.Когда это будет сделано, просто отбросьте результаты.

Три, поместите вычисление в свой собственный домен / процесс приложения.При желании убейте этот внешний процесс.


В каждом есть хорошие и плохие вещи.

1 голос
/ 12 марта 2012

да?Просто используйте Thread и рабочий метод.

Thread thread = new Thread(MyWorkerMethod);
thread.Start();

thread.Abort();


void MyWorkerMethod() {
    // do anything you want in here
}
...