KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
Here’s an interesting library writer’s dilemma. In my library (in my case EasyNetQ) I’m assigning thread local resources. So when a client creates a new thread and then calls certain methods on my library new resources get created. In the case of EasyNetQ a new channel to the RabbitMQ server is created when the client calls ‘Publish’ on a new thread. I want to be able to detect when the client thread exits so that I can clean up the resources (channels). The only way of doing this I’ve come up with is to create a new ‘watcher’ thread that simply blocks on a Join call to the client thread. Here a simple demonstration: First my ‘library’. It grabs the client thread and then creates a new thread which blocks on ‘Join’: public class Library { public void StartSomething() { Console.WriteLine("Library says: StartSomething called"); var clientThread = Thread.CurrentThread; var exitMonitorThread = new Thread(() => { clientThread.Join(); Console.WriteLine("Libaray says: Client thread existed"); }); exitMonitorThread.Start(); } } Here’s a client that uses my library. It creates a new thread and then calls my library’s StartSomething method: public class Client { private readonly Library library; public Client(Library library) { this.library = library; } public void DoWorkInAThread() { var thread = new Thread(() => { library.StartSomething(); Thread.Sleep(10); Console.WriteLine("Client thread says: I'm done"); }); thread.Start(); } } When I run the client like this: var client = new Client(new Library()); client.DoWorkInAThread(); // give the client thread time to complete Thread.Sleep(100); I get this output: Library says: StartSomething called
Tags (comma-separated)
Save Edits
Cancel