ThreadStart.BeginInvoke создает исключение NotSupportedException на платформе Compact

2

Я работаю с потоками в компактном проекте рамки и имею код, который выглядит примерно так. Когда я пытаюсь войти в StartThreads(), генерируется исключение NotSupportedException. Это кажется немного странным, почему исключение выбрано в строке, вызывающей StartThreads(), а не внутри, и что это не поддерживается на CF? Я думаю, что его ThreadStart.BeginInvoke, но это не то, где на самом деле возникает исключение.

void SomeMethod()
{
  this.StartThreads(); // <- NotSupportedException is thrown here, I can't step into this method with the debugger
}

void StartThreads()
{
  ThreadStart threadStart = BeginDoStuff;
  threadStart.BeginInvoke(EndDoStuff, null);
}
Теги:
multithreading
compact-framework

2 ответа

2
Лучший ответ

Механизм BeginInvoke не поддерживается в CF , а также ThreadPool.

Причина, по которой вы не видите Exception, где вы ожидаете, объясняется тем, как это реализовано. Я не совсем уверен в деталях, но BeginInvoke - это не обычный метод (класса Delegate), а то, что вводится во время выполнения (просто догадываясь о последней части).

Ошибка возникает, когда компилятор JIT начинает работать с методом StartThreads.

  • 0
    Хорошо, спасибо, приводит меня к моему следующему вопросу stackoverflow.com/questions/1063189/…
  • 1
    Пул потоков поддерживается и широко используется в моем приложении CF
Показать ещё 1 комментарий
1

delegate.BeginInvoke не поддерживается на CF.

Однако поддерживается ThreadPool. Вы можете использовать пул потоков для достижения практически одинакового поведения.

void SomeMethod()
{
   this.StartThreads();
}

void StartThreads()
{
    System.Threading.ThreadPool.QueueUserWorkItem(DoStuff);
}

если вы хотите, чтобы он вызывал обратный вызов по завершении, я предлагаю вам прочитать асинхронную модель программирования

Ещё вопросы

Сообщество Overcoder
Наверх
Меню