Невозможно уничтожить рабочий поток в Silverlight - PullRequest
4 голосов
/ 23 января 2009

Я работаю над многопоточным приложением Silverlight.

Приложение имеет два потока: основной / пользовательский интерфейс и фоновый рабочий поток.

Поток пользовательского интерфейса должен иметь возможность убить фоновый поток, например:

private Thread executionThread;

....

executionThread = new Thread(ExecuteStart);
executionThread.Start();

....

executionThread.Abort(); // when the user clicks "Stop"

Последняя строка вызывает исключение:

MethodAccessException: Попытка доступа к методу не удалась: System.Threading.Thread.Abort ()

Есть идеи? почему я не могу прервать тему в Silverlight?

Спасибо, Наий

Ответы [ 3 ]

6 голосов
/ 23 января 2009

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

Этот класс имеет встроенную функциональность для отмены асинхронной операции, когда WorkerSupportsCancellation = true.

Посмотрите эту статью на MSDN, чтобы * полный пример того, как использовать BackgroundWorker в Silverlight.

4 голосов
/ 23 января 2009

Это задокументировано, см. Thread.Abort ()

Этот участник имеет Атрибут SecurityCriticalAttribute, что ограничивает его для внутреннего использования .NET Framework для Silverlight библиотека классов. Код приложения, который использует этот член бросает MethodAccessException.

Вы можете использовать ManualResetEvent (потокобезопасный метод связи), чтобы подать фоновый поток на остановку.

Пример кода в фоновом потоке:

if (!shouldStop.WaitOne(0)) 
// you could also sleep 5 seconds by using 5000, but still be stopped 
// after just 2 seconds by the other thread.
{
    // do thread stuff
}
else
{
    // do cleanup stuff and exit thread.
}
0 голосов
/ 23 января 2009

Поскольку код Silverlight распространяется через Интернет, он, как правило, не заслуживает доверия, и его выполнение более ограничено, как отметил Дэви. Вместо этого реализуйте логический флаг выхода в классе, каноническом для фонового потока, чтобы вы могли поднять этот флаг и использовать вместо него Thread.Join ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...