I have a program that uses threads to perform time-consuming processes sequentially. I want to be able to monitor the progress of each thread similar to the way that the BackgroundWorker.ReportProgress/ProgressChanged model does. I can’t use ThreadPool or BackgroundWorker due to other constraints I’m under. What is the best way to allow/expose this functionality. Overload the Thread class and add a property/event? Another more-elegant solution?
I have a program that uses threads to perform time-consuming processes sequentially. I want
Share
If by “overload” you actually mean inherit then no. The
Threadis sealed so it cannot be inherited which means you will not be able to add any properties or events to it.Create a class that encapsulates the logic that will be executed by the thread. Add a property or event (or both) which can be used to obtain progress information from it.
Update:
Let me be a little more clear on why a memory barrier is necessary in this situation. The barrier prevents the read from being moved before other instructions. The most likely optimization is not from the CPU, but from the JIT compiler “lifting” the read of
Progressoutside of thewhileloop. This movement gives the impression of “stale” reads. Here is a semi-realistic demonstration of the problem.It is imperative that a Release build is ran without the vshost process. Either one will disable the optimization that manifest the bug (I believe this is not reproducable in framework version 1.0 and 1.1 as well due to their more primitive optimizations). The bug is that “Stopped” is never displayed even though it clearly should be. Now, uncomment the call to
Thread.MemoryBarrierand notice the change in behavior. Also keep in mind that even the most subtle changes to the structure of this code currently inhibit the compiler’s ability to make the optimization in question. One such change would be to actually invoke the delegate. In other words you cannot currently reproduce the stale read problem using the null check followed by an invocation pattern, but there is nothing in the CLI specification (that I am aware of anyway) that prohibits a future hypothetical JIT compiler from reapplying that “lifting” optimization.