Я работаю с потоками в компактном проекте рамки и имею код, который выглядит примерно так. Когда я пытаюсь войти в 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);
}
Механизм BeginInvoke не поддерживается в CF , а также ThreadPool.
Причина, по которой вы не видите Exception, где вы ожидаете, объясняется тем, как это реализовано. Я не совсем уверен в деталях, но BeginInvoke - это не обычный метод (класса Delegate), а то, что вводится во время выполнения (просто догадываясь о последней части).
Ошибка возникает, когда компилятор JIT начинает работать с методом StartThreads.
delegate.BeginInvoke не поддерживается на CF.
Однако поддерживается ThreadPool. Вы можете использовать пул потоков для достижения практически одинакового поведения.
void SomeMethod()
{
this.StartThreads();
}
void StartThreads()
{
System.Threading.ThreadPool.QueueUserWorkItem(DoStuff);
}
если вы хотите, чтобы он вызывал обратный вызов по завершении, я предлагаю вам прочитать асинхронную модель программирования