2009-06-30 6 views
2

Je travaille avec des threads sur un projet de framework compact et j'ai un code qui ressemble à quelque chose comme ci-dessous. Lorsque j'essaie de démarrer dans StartThreads(), une exception NotSupportedException est levée. Cela semble un peu bizarre, pourquoi l'exception est-elle lancée sur la ligne appelant StartThreads() et non à l'intérieur, et qu'est-ce qui n'est pas supporté par CF? Je pense que c'est ThreadStart.BeginInvoke mais ce n'est pas là que l'exception est réellement lancée.ThreadStart.BeginInvoke throws NotSupportedException sur le framework Compact

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); 
} 

Répondre

2

Le mécanisme BeginInvoke est pas pris en charge dans CF , ainsi que le ThreadPool .

La raison pour laquelle vous ne voyez pas l'exception là où vous vous attendez est due à la façon dont cela est implémenté. Je ne suis pas totalement sûr des détails, mais BeginInvoke n'est pas une méthode normale (de la classe Delegate), mais quelque chose qui est injecté à l'exécution (juste deviner cette dernière partie).

L'erreur se produit lorsque le compilateur JIT fonctionne sur la méthode StartThreads.

+0

Ok merci, me conduit à ma question suivante http://stackoverflow.com/questions/1063189/asynccallback -pour-un-thread-sur-compact-framework – Charlie

+1

Thread pool est pris en charge, et largement utilisé dans mon applciation CF – trampster

+0

Daniel, vous avez raison, j'aurais dû vérifier cela mieux. –

1

delegate.BeginInvoke n'est pas pris en charge sur CF.

Cependant, ThreadPool est pris en charge. Vous pouvez utiliser le pool de threads pour obtenir essentiellement le même comportement.

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

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

si vous voulez appeler un rappel lorsque vous avez terminé, je vous suggère de lire sur les Asynchronous Programming Model

Questions connexes