Great, Brian.
 
I successfully reproduced the state with a very simple application. Here is very dumb python program that uses the CLR:
 
from CLR.System import String
 
class cSharpCaller( object ):
    def __init__( self ):
        print "Created a cSharpCaller instance"
        self.__cSharpString = None
 
    def createCSharpString( self, str ):
        self.__cSharpString = String( str )
 
    def returnCSharpString( self ):
        return self.__cSharpString.ToString()
And if I test this with this (dumb) threethreaded testprogram:
 
 
import threading, thread, time
 
from cSharpCaller import cSharpCaller
 
def start_threads(amount=5):
    for i in range(amount):
         thread = threading.Thread(target=process_thread )
         print "starting thread ", thread.getName()
         thread.start()
 
def process_thread(  ):
    print "thread  started "
    for i in range( 2 ):
        print "Hi, I'm a thread"
        time.sleep( 1 )
    cs = cSharpCaller( )
    cs.createCSharpString( "created from a thread" )
    print "cs.returnCSharpString() = ", cs.returnCSharpString()
    print "thread %s ended"
 
start_threads( 3 )
 
I get this output:
 
starting thread  thread0
thread  started
Hi, I'm thread %s
starting thread  thread1
thread  started
Hi, I'm thread %s
starting thread  thread2
thread  started
Hi, I'm thread %s
Hi, I'm thread %s
Hi, I'm thread %s
Hi, I'm thread %s
Created a cSharpCaller instance
Created a cSharpCaller instance
cs.returnCSharpString() =
 
and I have to CTRL+Pause to get out of the hang. Clearly hangs on the first String.ToString() method call.
 
Regards,
 
Torgeir