Wal, That does not really work properly. You have to dispose the object as well plus (I've tried it) every now and then it hits some odd error. I don't think [ThreadStatic] is safe to use with Parallel.ForEach.
Corneliu,. On Fri, Feb 15, 2013 at 10:45 PM, Wallace Turner <[email protected]>wrote: > It should work fine... the following code does what its supposed to do :) > > [ThreadStatic] > private static object _hasher; > > > var items = Enumerable.Range(1, 50); > > Parallel.ForEach(items, (i, state) => > { > if (_hasher == null) > { > _hasher = new object(); > Console.WriteLine("new hasher for thread " + > Thread.CurrentThread.ManagedThreadId); > } > Console.WriteLine(i + " " + > Thread.CurrentThread.ManagedThreadId); > > }); > > > On Fri, Feb 15, 2013 at 7:37 PM, Wallace Turner > <[email protected]>wrote: > >> attribute your hasher with [ThreadStatic] ? (and obviously move the init >> check into the loop which would only be done once per thread) >> >> http://msdn.microsoft.com/en-us/library/system.threadstaticattribute.aspx >> >> >> On Fri, Feb 15, 2013 at 7:00 PM, Corneliu I. Tusnea < >> [email protected]> wrote: >> >>> I hit exactly the same issue with calculating hashes. I don't think it's >>> threadsafe to do it. Just initialize it in each thread. I found the >>> performance to be acceptable (at least for my use). >>> However if you do find a better way I'd like to know :) >>> >>> >>> On Fri, Feb 15, 2013 at 8:38 PM, mike smith <[email protected]> wrote: >>> >>>> SOme of the stuff around here about TLS? >>>> >>>> http://msdn.microsoft.com/en-us/library/6sby1byh.aspx >>>> >>>> >>>> On Fri, Feb 15, 2013 at 7:25 PM, Greg Keogh <[email protected]> wrote: >>>> >>>>> Folks, I can't remember if I've asked about this before. I think I >>>>> year ago when I hit this I gave up and worked around it ... but now I want >>>>> it solved! >>>>> >>>>> I have a Parallel.ForEach loop over EnumerateFiles which is blazing >>>>> fast, but then I added to code to make an MD5 hash of the files and it >>>>> dies >>>>> because of "Hash not valid for use in specified state". I have a single >>>>> static MD5 hasher which lives for the life of the app, but calling it from >>>>> many threads is not allowed. >>>>> >>>>> I have a suspicion there is an overload of Parallel.ForEach that >>>>> allows each thread to start/use/finish its own resources. In theory I need >>>>> each thread needs to make its own MD5 and dispose at the end. There are so >>>>> many overloads in the Threading Tasks namespace that I'm confused at first >>>>> and I'll have to plod through Jeffrey Richter's book overnight to find a >>>>> possible example. >>>>> >>>>> Are there any Task ninjas out there who know how to do this sort of >>>>> thing? >>>>> >>>>> Greg K >>>>> >>>>> P.S. I just went to pat the cat and on the way back I picked up >>>>> Richter's CLR via C# and I found a skeleton example on page 742 where he >>>>> adds up the sizes of all files in a folder. However, the example is very >>>>> terse and I'll need to stare at it for a while to grok it. I will need to >>>>> check that this example behaves consistently under all conditions such as >>>>> cancellation, unhandled crash, etc. If I find anything useful I'll let you >>>>> know. >>>>> >>>> >>>> >>>> >>>> -- >>>> Meski >>>> >>>> http://courteous.ly/aAOZcv >>>> >>>> "Going to Starbucks for coffee is like going to prison for sex. Sure, >>>> you'll get it, but it's going to be rough" - Adam Hills >>>> >>> >>> >> >
