views:

510

answers:

2

I'm working with threads on a compact framework project and have code that looks something like below. When I try to step into StartThreads(), a NotSupportedException is thrown. This seems a bit wierd, why is the exception thrown on the line calling StartThreads() and not inside, and what is it that's not supported on CF? I think its ThreadStart.BeginInvoke but that's not where the exception is actually being thrown.

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);
}
+2  A: 

The BeginInvoke mechanism is not supported in CF, along with the ThreadPool.

The reason you don't see the Exception where you expect is due to the way this is implemented. I am not totally sure about the details but BeginInvoke is not a normal method (of the Delegate class) but something that is injected at runtime (just guessing that last part).

The error occurs when the JIT compiler gets to work on the StartThreads method.

Henk Holterman
Ok thanks, leads me to my next question http://stackoverflow.com/questions/1063189/asynccallback-for-a-thread-on-compact-framework
Charlie
Thread pool is supported, and used extensively in my CF applciation
trampster
Daniel, you are right, I should have checked that better.
Henk Holterman
A: 

delegate.BeginInvoke is not supported on the CF.

However the ThreadPool is supported. You can use the thread pool to achieve essentially the same behavior.

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

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

if you want it to call a callback when finished I suggest you read up on the Asynchronous Programming Model

trampster